突然间,我的所有项目都发生了这种情况。
每当我使用express和body-parser req.body
在nodejs中发帖时,都是一个空对象。
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
$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/
它按预期工作。
我尝试在前者中手动设置Content-type : application/json
但我总是得到400 bad request
这让我发疯了。
我认为这是在身体解析器中更新的内容但是我降级了并且没有帮助。
感谢任何帮助,谢谢。
答案 0 :(得分:218)
在Postman的3个可用于内容类型的选项中选择" X-www-form-urlencoded"它应该工作。
还要删除错误消息替换:
app.use(bodyParser.urlencoded())
使用:
app.use(bodyParser.urlencoded({
extended: true
}));
请参阅https://github.com/expressjs/body-parser
'身体解析器'中间件只处理JSON和urlencoded数据,而不是多部分
答案 1 :(得分:174)
使用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
答案 2 :(得分:43)
我犯了一个非常愚蠢的错误,忘了为我的html文件中的输入定义name
属性。
所以而不是
<input type="password" class="form-control" id="password">
我有这个。
<input type="password" class="form-control" id="password" name="password">
现在request.body
填充如下:{ password: 'hhiiii' }
答案 3 :(得分:25)
我发现,它在使用内容类型
发送时有效&#34;应用/ JSON&#34;
与服务器端组合
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
中可用。
答案 4 :(得分:16)
我今天遇到了这个问题,修复了Postman中删除内容类型标题的原因!很奇怪。在这里添加它,以防它帮助某人。
我在这里关注BeerLocker教程:http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/
答案 5 :(得分:7)
您必须检查正文解析器中间件是否正确设置为请求类型(json,urlencoded)。
如果你已经设置,
app.use(bodyParser.json());
然后在邮递员中你必须以粗略的方式发送数据。
https://i.stack.imgur.com/k9IdQ.png邮递员截图
如果你已经设置,
app.use(bodyParser.urlencoded({
extended: true
}));
然后&#39; x-www-form-urlencoded&#39;应该选择选项。
答案 6 :(得分:6)
答案 7 :(得分:5)
我的问题是我先创建了路线
// ...
router.get('/post/data', myController.postHandler);
// ...
并在 路线后注册中间件
app.use(bodyParser.json());
//etc
由于应用程序结构和从示例中一起复制和粘贴项目。
一旦我修改了在路线之前注册中间件的订单,一切都有效。
答案 8 :(得分:4)
即使我第一次学习node.js,我开始通过网络应用程序学习它,我在我的表单中以完美的方式完成了所有这些事情,但仍然无法在发布请求中接收值。经过长时间的调试,我开始知道我提供enctype="multipart/form-data"
的形式,因为我无法获得价值。我只是删除它,它对我有用。
答案 9 :(得分:3)
看起来如果您不使用任何encType(默认为application/x-www-form-urlencoded
),那么您确实会获得文本输入字段,但您不会获得文件。
如果您有要发布文本输入和文件的表单,请使用multipart/form-data
编码类型,此外还要使用multer
中间件。 Multer将解析请求对象并为您准备req.file
,所有其他输入字段将通过req.body
提供。
答案 10 :(得分:3)
在邮递员中,即使遵循了可接受的答案,我也得到了一个空的请求正文。原来,该问题未传递名为
的标头Content-Length : <calculated when request is sent>
此标头默认情况下(以及其他5个)存在,但我已将其禁用。启用它,您将收到请求正文。
答案 11 :(得分:2)
我使用上面建议的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)
});
答案 12 :(得分:2)
类似的问题发生在我身上,我简单地混合了回调参数的顺序。确保您正在以正确的顺序设置回调函数。至少对于有同样问题的人来说。
router.post('/', function(req, res){});
答案 13 :(得分:1)
确保[&#34; key&#34; :&#34;输入&#34;,&#34;值&#34; :&#34; json&#34;]&amp; [&#34; key&#34;:&#34; Content-Type&#34;,&#34; value&#34;:&#34; application / x-www-form-urlencoded&#34;]在你的邮递员请求标题
答案 14 :(得分:1)
在通过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));
}
});
}
答案 15 :(得分:1)
几分钟前我遇到了同样的问题,我尝试了上述答案中的所有可能方法,但其中任何一个都有效。
我唯一要做的就是升级Node JS版本,我不知道升级会影响某些事情,但是确实如此。
我已经安装了Node JS版本.rememberMe()
.alwaysRemember(true)
.tokenValiditySeconds(30)
.rememberMeCookieName("saurabh")
.key("somesecret");
(最新版本),我回到了10.15.0
,现在一切正常。也许8.11.3
模块应该对此进行修复。
答案 16 :(得分:1)
在发出邮递员请求时,错误源未定义特定的标头类型。我只是通过添加
来解决它Content-Type: application/json
或者在 postman 中明确定义原始数据类型为 JSON,同时发出请求也可以解决问题。
答案 17 :(得分:1)
我通过在前端更改表单的 enctype 解决了这个问题:
<form enctype="multipart/form-data">
<form enctype="application/json">
看到数据最终弹出控制台真是一种解脱^^
答案 18 :(得分:0)
我相信这可以解决app.use(express.json());
答案 19 :(得分:0)
只是一个快速输入 - 我遇到了同样的问题(在失眠时测试我的私有 api),当我添加 Content-Type: application/json 时,它立即起作用了。令我困惑的是,我对 GET 和 POST 请求的处理方式几乎相同,但 PUT 似乎不起作用。我真的真的希望这有助于让某人摆脱调试的兔子洞!
答案 20 :(得分:0)
就我而言,我使用 Fetch API 发送 POST 请求,而在正文中,我发送的是对象而不是字符串。
错误 -> { body: { email: 'value' } }
我通过字符串化正文来纠正 -> { body: JSON.stringify({ email: 'value' }) }
答案 21 :(得分:0)
对于Express 4.16+,无需安装body-parser,请使用以下命令:
const express = require('express');
const app = express();
app.use(express.json());
app.post('/your/path', (req, res) => {
const body = req.body;
...
}
答案 22 :(得分:0)
我的问题是先创建路线
require("./routes/routes")(app);
我把它移到了代码的末尾
app.listen
而且有效!
答案 23 :(得分:0)
谢谢大家的精彩回答!
花了很多时间寻找解决方案,在我这边,我犯了一个基本错误:我在函数内调用bodyParser.json()
:
app.use(['/password'], async (req, res, next) => {
bodyParser.json()
/.../
next()
})
我只需要做app.use(['/password'], bodyParser.json())
就可以了...
答案 24 :(得分:0)
将代码中的app.use(bodyParser.urlencoded());
更改为
app.use(bodyParser.urlencoded({extended : false}));
和邮递员中,标题更改为Content-Type
application/x-www-form-urlencoded
至application/json
Ta:-)
答案 25 :(得分:0)
我的输入中没有名字...我的请求为空...很高兴完成了我的工作,我可以继续编码。谢谢大家!
Jason Kim使用的答案:
所以不是
<input type="password" class="form-control" id="password">
我有这个
<input type="password" class="form-control" id="password" name="password">
答案 26 :(得分:0)
我正在使用restify而不是express并遇到同样的问题。解决方法是做:
server.use(restify.bodyParser());