req.body在帖子上空了

时间:2014-07-03 02:03:56

标签: node.js express

突然间,我的所有项目都发生了这种情况。

每当我使用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

这让我发疯了。

我认为这是在身体解析器中更新的内容但是我降级了并且没有帮助。

感谢任何帮助,谢谢。

27 个答案:

答案 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

Postman raw json payload

答案 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)

如果您与邮递员在一起,请在请求API时确认这些内容

enter image description here

答案 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.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)
});

答案 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-urlencodedapplication/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());