req.body在帖子上空了
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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和postman它总是空的。
但是通过卷曲
$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/
它按预期工作。
我尝试在前者手动设置Content-type : application/json
但我总是得到400 bad request
这让我发疯了。
我认为这是在身体解析器中更新的东西,但我降级了,但没有帮助。
任何帮助表示感谢,谢谢。
在Postman的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数据,而不是multipart
类似的问题发生在我身上,我简单地混合了回调参数的顺序。确保您正在以正确的顺序设置回调函数。至少对于有同样问题的人来说。
router.post('/', function(req, res){});
我按照上面的建议使用multer
解决了这个问题,但他们错过了一个完整的工作示例,关于如何做到这一点。基本上,当你有一个带有enctype="multipart/form-data"
的表单组时,就会发生这种情况。这是我的表格的html:
<form action="/stats" enctype="multipart/form-data" method="post">
<div class="form-group">
<input type="file" class="form-control-file" name="uploaded_file">
<input type="text" class="form-control" placeholder="Number of speakers" name="nspeakers">
<input type="submit" value="Get me the stats!" class="btn btn-default">
</div>
</form>
以下是如何使用multer
获取Express.js
和node.js
的此表单的值和名称:
var multer = require('multer')
var upload = multer({ dest: './public/data/uploads/' })
app.post('/stats', upload.single('uploaded_file'), function (req, res) {
// req.file is the name of your file in the form above, here 'uploaded_file'
// req.body will hold the text fields, if there were any
console.log(req.file, req.body)
});
确保[“key”:“type”,“value”:“json”]和[“key”:“Content-Type”,“value”:“application / x-www-form-urlencoded”]在你的邮差请求标题
你不应该通过AJAX发送JSON.stringify(数据),如下所示
this is not correct code
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));
}
});
}
几分钟前我遇到了同样的问题,我在上面的答案中尝试了一切,但是其中任何一个都有效。
我唯一做的就是升级Node JS版本,我不知道升级可能会对某些东西产生影响,但确实如此。
我已经安装了Node JS版本10.15.0
(最新版本),我回到了8.11.3
,现在一切正常。也许body-parser
模块应该对此进行修复。
我正在使用restify而不是express并遇到同样的问题。解决方案是做:
server.use(restify.bodyParser());
使用Postman,要使用原始JSON数据有效负载测试HTTP post操作,请选择raw
选项并设置以下标头参数:
Content-Type: application/json
另外,请务必用双引号将JSON有效内容中用作键/值的任何字符串包装起来。
body-parser
包将解析多行原始JSON有效负载。
{
"foo": "bar"
}
使用Postman v0.8.4.13扩展(body-parser
v1.12.2和express
v4.12.3)在Chrome v37和v41中进行测试,设置如下:
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
我犯了一个非常愚蠢的错误,忘了为我的html文件中的输入定义name
属性。
而不是
<input type="password" class="form-control" id="password">
我有这个。
<input type="password" class="form-control" id="password" name="password">
现在request.body
就像这样填充:{ password: 'hhiiii' }
我发现,它在使用内容类型发送时有效
“应用程序/ 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
中找到。
我今天遇到了这个问题,修复它的是删除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
由于应用程序结构,并从示例中复制和粘贴项目。
一旦我修改了在路由之前注册中间件的订单,一切都奏效了。
您必须检查正文解析器中间件是否正确设置为请求类型(json,urlencoded)。
如果你有,
app.use(bodyParser.json());
然后在邮递员中你必须以粗略的方式发送数据。
https://i.stack.imgur.com/k9IdQ.png邮差截图
如果你有,
app.use(bodyParser.urlencoded({
extended: true
}));
然后应该选择'x-www-form-urlencoded'选项。
即使我第一次学习node.js,我开始通过web-app学习它,我在我的表单中完成了所有这些事情,但仍然无法在post请求中接收值。经过长时间的调试,我开始知道我提供的enctype="multipart/form-data"
形式,因为我无法获得价值。我只是删除它,它对我有用。
看来如果你不使用任何encType(默认是application/x-www-form-urlencoded
),那么你确实得到文本输入字段,但你不会得到文件。
如果你有一个表格,你想要发布文本输入和文件然后使用multipart/form-data
编码类型,除此之外使用multer
中间件。 Multer将解析请求对象并为您准备req.file
,所有其他输入字段将通过req.body
提供。
以上是关于req.body在帖子上空了的主要内容,如果未能解决你的问题,请参考以下文章