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

每当我在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个坏请求

这快把我逼疯了。

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

感谢任何帮助,谢谢。


当前回答

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

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

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

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

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

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

其他回答

发出邮差请求时,错误源没有定义特定的报头类型。我只是简单地用两种方法相加

Content-Type: application/json

或者在postman中显式地将原始数据类型定义为JSON,同时发出请求也可以解决问题。

确保["key":" type", "value":" json"] & ["key":"Content-Type", "value":"application/x-www-form-urlencoded"]在你的邮差请求头中

几分钟前我也遇到了同样的问题,我在上面的答案中尝试了所有可能的方法,但它们都有效。

我做的唯一一件事,就是升级Node JS版本,我不知道升级会影响一些东西,但它确实影响了。

我已经安装了Node JS 10.15.0版本(最新版本),我返回到8.11.3,现在一切正常。也许体解析器模块应该对此进行修复。

改变app.use (bodyParser.urlencoded ());在代码中

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

而在postman中,在header中更改Content-Type值为 Application /x-www-form-urlencoded为Application /json

助教:-)

使用Postman,要测试带有原始JSON数据有效负载的HTTP post动作,请选择raw选项并设置以下报头参数:

Content-Type: application/json

另外,确保在JSON有效负载中用双引号包装任何用作键/值的字符串。

主体解析器包可以很好地解析多行原始JSON有效负载。

{
    "foo": "bar"
}

在Chrome v37和v41中使用Postman v0.8.4.13扩展(body-parser v1.12.2和express v4.12.3)测试,设置如下:

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

// configure the app to use bodyParser()
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

// ... Your routes and methods here