突然之间,我所有的项目都出现了这种情况。

每当我在nodejs中使用express和body-parser req发布帖子时。Body是一个空对象。

var express    = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())

// parse application/json
app.use(bodyParser.json())

app.listen(2000);

app.post("/", function (req, res) {
  console.log(req.body) // populated!
  res.send(200, req.body);
});

通过ajax和邮递员,它总是空的。

但是通过curl

$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/

它按预期工作。

我尝试在前者中手动设置Content-type: application/json,但我总是得到400个坏请求

这快把我逼疯了。

我以为是身体解析器更新了一些东西,但我降级了,它没有帮助。

感谢任何帮助,谢谢。


当前回答

如果你在做邮差,请在申请API时确认这些东西

其他回答

表达4.17.1

这样的服务器中间件示例没有bodyParser;

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

如果你是GET请求头应该是这样的;

{'Content-Type': 'application/json'}

如果你是POST请求头应该像这样;

{'Content-Type': 'application/x-www-form-urlencoded'}

我在客户端使用这样的简单函数;

async function _GET(api) {
    return await (await fetch(api, {
        method: 'GET',
        mode: 'no-cors',
        cache: 'no-cache',
        credentials: 'same-origin',
        headers: {
            'Content-Type': 'application/json; charset=utf-8',
            'Connection': 'keep-alive',
            'Accept': '*',
        },
    })).json();
};

async function _POST (api, payload) {
    return await (await fetch(api, {
        method: 'POST',
        mode: 'no-cors',
        cache: 'no-cache',
        credentials: 'same-origin',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Connection': 'keep-alive',
            'Accept': '*/*',
        },
        body: new URLSearchParams(payload),
    })).json();
};

似乎如果你不使用任何encType(默认是application/x-www-form-urlencoded),那么你会得到文本输入字段,但你不会得到文件。

如果你有一个表单,你想发布文本输入和文件,然后使用多部分/表单数据编码类型,除此之外,使用多元中间件。Multer将解析请求对象并准备req。您的文件和所有其他输入字段将通过req.body获得。

我今天遇到了这个问题,解决它的方法是删除Postman中的内容类型头!很奇怪。把它加到这里,说不定能帮到谁。

我在这里跟随BeerLocker教程:http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/

我的问题是我先创建了路线

// ...
router.get('/post/data', myController.postHandler);
// ...

并且在路由之后注册中间件

app.use(bodyParser.json());
//etc

由于应用程序结构&复制和粘贴项目在一起的例子。

一旦我修正了在路由之前注册中间件的顺序,一切就都工作了。

在邮差的3个选项可用的内容类型选择“X-www-form-urlencoded”,它应该工作。

还可以摆脱错误消息替换:

app.use(bodyParser.urlencoded())

:

app.use(bodyParser.urlencoded({
  extended: true
}));

参见https://github.com/expressjs/body-parser

“体解析器”中间件只处理JSON和urlenencoded数据,而不是多部分

正如@SujeetAgrahari提到的,体解析器现在内置在express.js中。

使用app.use (express.json ());在JSON体的最新版本中实现它。对于URL编码的主体(由HTTP表单POSTs生成的那种)使用app.use(express.urlencoded());