我的所有项目都突然发生了这种情况.
每当我使用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
这让我发疯了.
我认为这是在身体解析器中更新的东西,但我降级了,但没有帮助.
任何帮助表示感谢,谢谢.
Mic*_*len 243
在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
小智 191
使用Postman,要使用原始JSON数据有效负载测试HTTP post操作,请选择该raw选项并设置以下标头参数:
Content-Type: application/json
另外,请务必用双引号将JSON有效内容中用作键/值的任何字符串包装起来.
该body-parser包将解析多行原始JSON有效负载.
{
    "foo": "bar"
}
使用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

Jas*_*Kim 45
我犯了一个非常愚蠢的错误,忘了name在我的html文件中定义输入的属性.
而不是
<input type="password" class="form-control" id="password">
我有这个.
<input type="password" class="form-control" id="password" name="password">
现在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);
并且结果request.body.name在服务器上可用.
Fat*_*can 17
快递4.17.1
服务器中间件示例如下,不带bodyParser;
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
如果你是 GET 请求头应该是这样的;
{'Content-Type': 'application/json'}
如果您是 POST 请求标头应该是这样的;
{'Content-Type': 'application/x-www-form-urlencoded'}
我在客户端使用这样的简单函数;
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();
};
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;
    ...
}
Tua*_*uan 10
您必须检查正文解析器中间件是否正确设置为请求类型(json,urlencoded).
如果你有,
app.use(bodyParser.json());
然后在邮递员中你必须以粗略的方式发送数据.
https://i.stack.imgur.com/k9IdQ.png邮递员截图
如果你有,
app.use(bodyParser.urlencoded({
    extended: true
}));
然后应该选择'x-www-form-urlencoded'选项.
小智 9
错误来源是在发出邮递员请求时未定义特定的标头类型。我只是通过添加解决了这个问题
Content-Type: application/json
或者在发出请求时在 postman 中显式定义原始数据类型为 JSON 也可以解决问题。
在邮递员中,即使按照接受的答案,我也收到了一个空的请求正文。问题原来是没有传递一个名为
Content-Length : <calculated when request is sent>
默认情况下,此标头存在(以及其他 5 个标头),我已禁用该标头。启用此功能,您将收到请求正文。
我的问题是我先创建路线
// ...
router.get('/post/data', myController.postHandler);
// ...
并在路由后注册中间件
app.use(bodyParser.json());
//etc
由于应用程序的结构和示例中的复制和粘贴项目。
一旦我确定了在路由之前注册中间件的命令,它就可以正常工作。
| 归档时间: | 
 | 
| 查看次数: | 212930 次 | 
| 最近记录: |