要求的事情。身体空在柱子上

突然之间,我所有的项目都出现了这种情况。

每当我使用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和邮递员,它总是空的。

但是通过curl

$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/

它按预期工作。

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

这快把我逼疯了。

我以为是身体解析器更新了一些东西,但我降级了,它没有帮助。

感谢任何帮助,谢谢。

431837 次浏览

在Postman的3个内容类型选项中选择“X-www-form-urlencoded"它应该会起作用。

还可以摆脱错误消息替换:

app.use(bodyParser.urlencoded())

:

app.use(bodyParser.urlencoded({
extended: true
}));

看到https://github.com/expressjs/body-parser

“体解析器”中间件只处理JSON和urlenencoded数据,而不是多部分

正如@SujeetAgrahari提到的,体解析器现在内置在express.js中。

在JSON体的最新版本中,使用app.use(express.json());来实现它。对于URL编码的主体(由HTTP表单post生成的那种)使用app.use(express.urlencoded());

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

Content-Type: application/json

另外,确保在JSON有效负载中用双引号包装任何用作键/值的字符串。

body-parser包可以很好地解析多行原始JSON有效负载。

{
"foo": "bar"
}

在Chrome v37和v41中测试了邮递员v0.8.4.13扩展(body-parser v1.12.2和express v4.12.3),设置如下:

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

邮差raw json payload

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

所以与其

<input type="password" class="form-control" id="password">

我有这个。

<input type="password" class="form-control" id="password" name="password">

现在request.body像这样填充

我今天遇到了这个问题,是什么修复了邮差中的删除内容类型标头 !很奇怪。把它加到这里,说不定能帮到谁。

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

即使当我第一次学习node.js时,我开始在web-app上学习它,我在我的表单中以良好的方式完成了所有这些事情,但我仍然无法在post request中接收值。经过长时间的调试,我才知道,在我提供enctype="multipart/form-data"的形式中,由于我无法获得值。我只是把它取下来,它就为我工作了。

我使用的是restify而不是express,遇到了同样的问题。解决办法是:

server.use(restify.bodyParser());

类似的问题发生在我身上,我只是混合了回调参数的顺序。确保以正确的顺序设置回调函数。至少对有同样问题的人来说是这样。

router.post('/', function(req, res){});

我发现,它的工作时,发送内容类型

“应用程序/ json"

in combination with server端
app.use(express.json())
(正如@marcelocra指出的那样,2022年版本将使用)

(旧版本参考)
app.use(bodyParser.json()); < / p >

现在我可以通过发送

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中可用。

确保["key": "type", "value": "json"] &["key":"Content-Type", "value":"application/x-www-form-urlencoded"]在你的邮差请求头中

似乎如果你不使用任何encType(默认是application/x-www-form-urlencoded),那么你会得到文本输入字段,但你不会得到文件。

如果你有一个表单,你想要发布文本输入和文件,那么使用multipart/form-data编码类型,除此之外,使用multer中间件。Multer将解析请求对象并为你准备req.file,所有其他输入字段将通过req.body可用。

我的问题是我先创建了路线

// ...
router.get('/post/data', myController.postHandler);
// ...

并注册中间件< em > < / em >后路由

app.use(bodyParser.json());
//etc

由于应用程序结构&从示例中复制并粘贴项目。

一旦我修正了在路由之前注册中间件的顺序,一切就都工作了。

如上所述,我使用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)
});

你不应该像下面这样通过AJAX发送JSON.stringify(data)

这不是正确的代码:

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));
}
});
}

您必须检查主体解析器中间件是否正确地设置为请求的类型(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版本,我不知道升级会影响一些东西,但它确实影响了。

我已经安装了Node JS版本10.15.0(最新版本),我返回到8.11.3,现在一切都在工作。也许body-parser模块应该对此进行修复。

我的输入中没有名字…我的请求是空的……很高兴这是完成的,我可以继续编码。谢谢大家!

Jason Kim的回答是:

所以与其

<input type="password" class="form-control" id="password">

我有这个

<input type="password" class="form-control" id="password" name="password">

我相信这可以解决app.use(express.json());

将代码中的app.use(bodyParser.urlencoded());更改为

app.use(bodyParser.urlencoded({extended : false}));

和在邮递员,在头改变Content-Type的值从 application/x-www-form-urlencodedapplication/json

助教:-)

谢谢大家的精彩回答! 花了相当多的时间寻找解决方案,在我这边,我犯了一个基本的错误:我从函数内调用bodyParser.json():

app.use(['/password'], async (req, res, next) => {
bodyParser.json()
/.../
next()
})

我只需要做app.use(['/password'], bodyParser.json())和它工作…

如果你在做邮差,请在申请API时确认这些东西

enter image description here

在邮差中,即使按照接受的答案,我也得到了一个空的请求体。问题是没有传递一个名为

Content-Length : <calculated when request is sent>

这个头是默认存在的(以及其他5个),我已经禁用了。启用此选项,您将收到请求正文。

我的问题是先创建路由 require("./routes/routes")(app); 我之前把它移到了代码末尾 app.listen 它成功了!< / p >

对于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;
...
}

我解决了这个问题通过改变我的形式在前端的enctype:

  • 它是⛔️<form enctype="multipart/form-data">
  • 我把它改为✅<form enctype="application/json">

看到数据最终弹出控制台,我松了一口气^^

在我的情况下,我使用Fetch API发送POST请求,在正文中,我发送了一个对象而不是字符串。

错误→{ body: { email: 'value' } }

我通过stringized body ->{ body: JSON.stringify({ email: 'value' }) }

发出邮差请求时,错误源没有定义特定的报头类型。我只是简单地用两种方法相加

Content-Type: application/json

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

只是一个快速输入-我有同样的问题(失眠测试我的私人api),当我添加Content-Type: application/json时,它立即工作了。让我困惑的是,对于GET和POST请求,我所做的一切几乎都是一样的,但是PUT似乎不能工作。我真的真的希望这篇文章能帮助一些人走出调试的兔子洞!

当表单不包含任何文件上传输入时,请确保您已经删除了表单标记处的enctype属性

enctype='multipart/form-data

检查您的HTML标签名称属性

<input name="fname">

body解析器使用标签名称属性来识别标签。

表达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();
};

我只是解决了为app.use()删除任何.json()或.urlencode()的问题,因为它们给了我一些问题。我用这个简单的解决方案编写了我的代码来重新创建流

app.post('/mypath',function(req,res){
data=""
// we can access HTTP headers
req.on('data', chunk => {
data+=chunk
})
req.on('end', () => {
console.log(data)
// here do what you want with data
// Eg: js=JSON.parse(data)
})
}