Node.js 要求主体在立柱上为空

Node.js 要求主体在立柱上为空,node.js,express,Node.js,Express,突然之间,我所有的项目都发生了这种情况 每当我使用express和body解析器在nodejs中发表文章时,body都是空对象 var express = require('express') var bodyParser = require('body-parser') var app = express() // parse application/x-www-form-urlencoded app.use(bodyParser.urlencoded()) // parse ap

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

每当我使用express和body解析器在nodejs中发表文章时,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个错误请求

这让我快发疯了

我原以为主体解析器中有更新的东西,但我降级了,这没用


感谢您的帮助。

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

另外,要消除错误消息替换,请执行以下操作:

app.use(bodyParser.urlencoded())
与:

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

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


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

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

Content-Type: application/json
另外,请确保将JSON负载中用作键/值的任何字符串用双引号括起来

该包将很好地解析多行原始JSON有效负载

{
    "foo": "bar"
}
在Chrome v37和v41中使用Postman v0.8.4.13扩展版(v1.12.2和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

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

所以不是

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

我有这个

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


现在,
request.body
是这样填充的:
{password:'hhiii'}
我今天遇到了这个问题,修复的方法是删除Postman中的内容类型头!很奇怪。在这里添加它以防对某人有所帮助


我在这里学习BeerLocker教程:

即使是在我第一次学习node.js时,我开始通过web应用学习它,我在表单中以良好的方式完成了所有这些事情,但我仍然无法在post请求中接收值。经过长时间的调试,我知道在我提供的
enctype=“multipart/form data”
表单中,我无法获取值。我只是简单地删除了它,它为我工作。

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

server.use(restify.bodyParser());

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

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

我发现,当使用内容类型发送时,它是有效的

“应用程序/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
中找到。

确保[“key”:“type”、“value”:“json”]&[“key”:“Content type”、“value”:“application/x-www-form-urlencoded”]在邮差请求头中

如果不使用任何encType(默认值是
application/x-www-form-urlencoded
)然后您会得到文本输入字段,但不会得到文件


如果您有一个表单,希望在其中发布文本输入和文件,则使用
multipart/formdata
编码类型,此外还使用
multer
中间件。Multer将解析请求对象并为您准备
req.file
,所有其他输入字段将通过
req.body

提供。我的问题是我首先创建了路由

// ...
router.get('/post/data', myController.postHandler);
// ...
并在路由后注册中间件

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>

在通过AJAX发送时,您不应该像下面这样执行
JSON.stringify(数据)

这是不正确的代码:

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、URLCoded)

如果你已经设定了

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));
然后在邮递员中,你必须将数据作为原始数据发送

邮递员截图

如果你已经设定了

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

然后应选择“x-www-form-urlencoded”选项。

几分钟前,我遇到了同样的问题,我尝试了上述答案中的所有可能方法,但其中任何一种都有效

我做的唯一一件事就是升级Node JS版本,我不知道升级会对某些方面产生影响,但确实如此


我已经安装了Node JS版本
10.15.0
(最新版本),我返回到
8.11.3
,现在一切正常。也许
主体解析器
模块应该对此进行修复。

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

Jason Kim使用的答案:

所以不是

<input type="password" class="form-control" id="password">
<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}));
在postman中,在标题中更改内容类型
application/x-www-form-urlencoded
application/json


Ta:-)

谢谢大家的精彩回答! 花了相当长的时间寻找解决方案,而在我这方面,我正在制造一个元素
Content-Type: application/json