req.body在帖子上空了

Jos*_*ley 223 node.js express

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

每当我使用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);
});
Run Code Online (Sandbox Code Playgroud)

通过ajax和postman它总是空的.

但是通过卷曲

$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/
Run Code Online (Sandbox Code Playgroud)

它按预期工作.

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

这让我发疯了.

我认为这是在身体解析器中更新的东西,但我降级了,但没有帮助.

任何帮助表示感谢,谢谢.

Mic*_*len 243

在Postman的3个可用于内容类型的选项中选择"X-www-form-urlencoded",它应该可以工作.

还要摆脱错误信息替换:

app.use(bodyParser.urlencoded())
Run Code Online (Sandbox Code Playgroud)

附:

app.use(bodyParser.urlencoded({
  extended: true
}));
Run Code Online (Sandbox Code Playgroud)

请参阅https://github.com/expressjs/body-parser

'body-parser'中间件只处理JSON和urlencoded数据,而不是multipart

  • 现在 body-parser 内置于express.js中,只需使用`app.use(express.json());` (26认同)
  • 由于某种原因,当我使用 `app.use(express.urlencoded());` 时,可以正确解析从另一个服务到我的应用程序(webhook)的请求,但不能使用 `app.use(express.json()) ;`(`request.body` 是 `{}`,一个空对象)。如果有人知道原因,请分享。 (2认同)

小智 191

使用Postman,要使用原始JSON数据有效负载测试HTTP post操作,请选择该raw选项并设置以下标头参数:

Content-Type: application/json
Run Code Online (Sandbox Code Playgroud)

另外,请务必用双引号将JSON有效内容中用作键/值的任何字符串包装起来.

body-parser包将解析多行原始JSON有效负载.

{
    "foo": "bar"
}
Run Code Online (Sandbox Code Playgroud)

使用Postman v0.8.4.13扩展(body-parserv1.12.2和expressv4.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
Run Code Online (Sandbox Code Playgroud)

邮差原始json有效载荷

  • 在 Postman 中使用 `form-data` 发布数据时,我总是在 req.body 中得到 `{}`。我应该设置`Content-Type`选项吗? (2认同)

Jas*_*Kim 45

我犯了一个非常愚蠢的错误,忘了name在我的html文件中定义输入的属性.

而不是

<input type="password" class="form-control" id="password">
Run Code Online (Sandbox Code Playgroud)

我有这个.

<input type="password" class="form-control" id="password" name="password">
Run Code Online (Sandbox Code Playgroud)

现在request.body填充如下:{ password: 'hhiiii' }


Xan*_*vis 30

我发现,它在使用内容类型发送时有效

"应用程序/ 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);
Run Code Online (Sandbox Code Playgroud)

并且结果request.body.name在服务器上可用.

  • 就我而言,我必须将其更改为“xmlHttp.send(JSON.stringify(data));” (2认同)
  • 根据其他答案,似乎最新的方法是使用“express.json()”而不是“bodyParser.json()”。 (2认同)

Fat*_*can 17

快递4.17.1

服务器中间件示例如下,不带bodyParser;

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
Run Code Online (Sandbox Code Playgroud)

如果你是 GET 请求头应该是这样的;

{'Content-Type': 'application/json'}
Run Code Online (Sandbox Code Playgroud)

如果您是 POST 请求标头应该是这样的;

{'Content-Type': 'application/x-www-form-urlencoded'}
Run Code Online (Sandbox Code Playgroud)

我在客户端使用这样的简单函数;

async function _GET(api) {
    return await (await fetch(api, {
        method: 'GET',
        mode: 'no-cors',
        cache: 'no-cache',
        credentials: 'same-origin',
        headers: {
            'Content-Type': 'application/json; charset=utf-8',
            'Connection': 'keep-alive',
            'Accept': '*',
        },
    })).json();
};

async function _POST (api, payload) {
    return await (await fetch(api, {
        method: 'POST',
        mode: 'no-cors',
        cache: 'no-cache',
        credentials: 'same-origin',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Connection': 'keep-alive',
            'Accept': '*/*',
        },
        body: new URLSearchParams(payload),
    })).json();
};
Run Code Online (Sandbox Code Playgroud)


sto*_*one 16

我今天遇到了这个问题,修复它的是删除 Postman 中的内容类型标题!很奇怪.在这里添加它,以防它有助于某人.

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

  • 我遇到过同样的问题.标题"未选中"(并且显示为灰色)是不够的,我必须完全删除它.即使"</>"源按钮显示我没有发送内容类型处于未检查状态的头,它仍然需要完全删除. (2认同)

vig*_*esh 12

如果你是和邮递员一起做的,请在请求 API 时确认这些东西

在此处输入图片说明


Ash*_*win 12

对于 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;
    ...
}
Run Code Online (Sandbox Code Playgroud)


Tua*_*uan 10

您必须检查正文解析器中间件是否正确设置为请求类型(json,urlencoded).

如果你有,

app.use(bodyParser.json());
Run Code Online (Sandbox Code Playgroud)

然后在邮递员中你必须以粗略的方式发送数据.

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

如果你有,

app.use(bodyParser.urlencoded({
    extended: true
}));
Run Code Online (Sandbox Code Playgroud)

然后应该选择'x-www-form-urlencoded'选项.


小智 9

错误来源是在发出邮递员请求时未定义特定的标头类型。我只是通过添加解决了这个问题

Content-Type: application/json
Run Code Online (Sandbox Code Playgroud)

或者在发出请求时在 postman 中显式定义原始数据类型为 JSON 也可以解决问题。

  • 在发出邮递员请求时必须检查“内容长度”。否则,它会抛出错误。 (3认同)

kau*_*nav 8

在邮递员中,即使按照接受的答案,我也收到了一个空的请求正文。问题原来是没有传递一个名为

Content-Length : <calculated when request is sent>
Run Code Online (Sandbox Code Playgroud)

默认情况下,此标头存在(以及其他 5 个标头),我已禁用该标头。启用此功能,您将收到请求正文。


fia*_*iat 7

我的问题是我先创建路线

// ...
router.get('/post/data', myController.postHandler);
// ...
Run Code Online (Sandbox Code Playgroud)

并在路由注册中间件

app.use(bodyParser.json());
//etc
Run Code Online (Sandbox Code Playgroud)

由于应用程序的结构和示例中的复制和粘贴项目。

一旦我确定了在路由之前注册中间件的命令,它就可以正常工作。