req.body帖子为空

突然,这已经发生在我所有的项目中。

每当我使用express和body-parser在nodejs中发帖时,它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 -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/

它按预期工作。

我尝试Content-type : application/json在前者中手动设置,但随后我总是得到400 bad request

这让我发疯。

我以为是人体分析器中有一些更新,但是我降级了,但无济于事。

任何帮助表示赞赏,谢谢。

小小JinJin蛋蛋2020/03/23 09:18:06

我相信这可以解决 app.use(express.json());

蛋蛋猿2020/03/23 09:18:06

app.use(bodyParser.urlencoded());将代码更改

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

在邮递员中,标题更改Content-Type值从 application/x-www-form-urlencodedapplication/json

Ta :-)

泡芙小胖2020/03/23 09:18:06

JSON.stringify(data)通过AJAX发送邮件时,您不应这样做,如下所示。

这是不正确的代码:

function callAjax(url, data) {
    $.ajax({
        url: url,
        type: "POST",
        data: JSON.stringify(data),
        success: function(d) {
            alert("successs "+ JSON.stringify(d));
        }
    });
}   

正确的代码是:

function callAjax(url, data) {
    $.ajax({
        url: url,
        type: "POST",
        data: data,
        success: function(d) {
            alert("successs "+ JSON.stringify(d));
        }
    });
}
飞云2020/03/23 09:18:06

我当时使用restify而不是express并遇到相同的问题。解决方案是:

server.use(restify.bodyParser());
Itachi梅2020/03/23 09:18:06

我的输入中没有名称...我的请求为空...很高兴完成了,我可以继续编码。感谢大家!

答:我使用Jason Kim:

所以代替

<input type="password" class="form-control" id="password">

我有这个

<input type="password" class="form-control" id="password" name="password">
古一2020/03/23 09:18:06

几分钟前我遇到了同样的问题,我尝试了上述答案中的所有可能方法,但其中任何一个都有效。

我唯一做的是升级Node JS版本,我不知道升级可能会影响某些事情,但是确实如此。

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

TomGil村村2020/03/23 09:18:06

我遇到了类似的问题,我只是混合了回调参数的顺序。确保您以正确的顺序设置了回调函数。至少对于有相同问题的任何人。

router.post('/', function(req, res){});
卡卡西2020/03/23 09:18:06

确保[“ key”:“ type”,“ value”:“ json”]&[“ key”:“ Content-Type”,“ value”:“ application / x-www-form-urlencoded”]邮递员请求标头

伽罗十三2020/03/23 09:18:06

即使当我第一次开始通过Web应用程序学习Node.js时,我仍然以自己的形式很好地完成了所有这些工作,但我仍然无法在请求后接收值。经过长时间的调试后,我知道以我提供的形式enctype="multipart/form-data"无法获取值。我只是删除了它,对我有用。

樱小胖Mandy2020/03/23 09:18:06

看来,如果您不使用任何encType(默认值为application/x-www-form-urlencoded),则可以获取文本输入字段,但不会获取文件。

如果您有一个要在其中张贴文本输入和文件的表单,请使用multipart/form-data编码类型,此外还要使用multer中间件。Multer将解析请求对象并req.file为您做准备,所有其他输入字段将通过提供req.body

Tom宝儿小宇宙2020/03/23 09:18:05

我今天遇到了这个问题,而在Postman中删除content-type标头的问题已解决了!很奇怪。在这里添加它以防有人帮助。

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

2020/03/23 09:18:05

我发现,使用内容类型发送时可以使用

“应用程序/ json”

与服务器端结合

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服务器上找到。

番长猴子2020/03/23 09:18:05

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

如果已经设定,

app.use(bodyParser.json());

然后在邮递员中,您必须将数据作为原始数据发送。

https://i.stack.imgur.com/k9IdQ.png邮递员屏幕截图

如果已经设定,

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

然后应选择“ x-www-form-urlencoded”选项。

老丝阿飞2020/03/23 09:18:05

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

另外,为了消除错误消息,请替换:

app.use(bodyParser.urlencoded())

带有:

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

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

“ body-parser”中间件仅处理JSON和urlencoded数据,而不是多部分