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.jsnode.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在帖子上空了的主要内容,如果未能解决你的问题,请参考以下文章

req.body在帖子上是空的

Express js req.body 返回空

Mongodb用populate返回更新的对象

Node.js:req.params 与 req.body

没有重复的猫鼬帖子

req.body 没有返回提交的数据