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

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

这快把我逼疯了。

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

感谢任何帮助,谢谢。


当前回答

您必须检查主体解析器中间件是否正确地设置为请求的类型(json, urlencoded)。

如果你设置了,

app.use(bodyParser.json());

然后在邮差你必须发送原始数据。

https://i.stack.imgur.com/k9IdQ.png邮差截图

如果你设置了,

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

然后应该选择'x-www-form-urlencoded'选项。

其他回答

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

我使用的是restify而不是express,遇到了同样的问题。解决办法是:

server.use(restify.bodyParser());

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

Content-Type: application/json

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

我解决了这个问题通过改变我的形式在前端的enctype:

它是⛔️<form enctype="multipart/form-data"> 我将其更改为✅<form enctype="application/json">

看到数据最终弹出控制台,我松了一口气^^

我发现,它的工作时,发送内容类型

“应用程序/ json”

与服务器端结合 app.use (express.json ()) (正如@marcelocra指出的那样,2022年的版本将使用)

(旧版本供参考) app.use (bodyParser.json ());

现在我可以通过发送

var data = {name:"John"}
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", theUrl, false); // false for synchronous request
xmlHttp.setRequestHeader("Content-type", "application/json");
xmlHttp.send(data);

结果在服务器上的request.body.name中可用。