请求不使用正文解析器显示数据

Posted

技术标签:

【中文标题】请求不使用正文解析器显示数据【英文标题】:request not showing data with body-parser 【发布时间】:2016-05-19 18:44:23 【问题描述】:

我正在将一些 JSON 对象从我的 AngularJS 客户端发送到我的 NodeJS 服务器。

这是我发出 POST 请求的客户端代码。

customerData.endPoint = "customers";
$http.post('https://woocommerce-api-samarthagarwal-1.c9users.io/api', customerData)
     .then(function(response)
          console.log(response)
      );

这是我的服务器代码。

var express = require('express');
var bodyParser = require("body-parser");
var app = express();

var urlParser = bodyParser.urlencoded( extended: true);
var jsonParser = bodyParser.json();

app.post('/api', jsonParser, function(request, response)
    response.setHeader("Access-Control-Allow-Origin", "*");
    console.log("body " + JSON.stringify(request.body));
    var endPoint = request.body.endPoint;
    console.log("POST on " + endPoint + " with Data " + (request.body.customer));
    );


var port = process.env.PORT;
var ip = process.env.IP
app.listen(port, ip,  function () 
  console.log('Server listening on ' + ip +':' + port);
);

但没有任何内容记录到控制台。

非常感谢任何帮助。提前致谢。

【问题讨论】:

你能记录 request.headers 吗?看起来你没有得到 Content-Type: application/json 这会阻止 bodyParser.json 解析请求 我在请求标头日志中得到'content-type': 'text/plain;charset=UTF-8' 在 Angular 端将该请求标头设置为 "application/json"。它告诉您的服务器(即解析器)它正在发送 JSON 有效负载。 这就是为什么你没有得到身体,如果你用curl调用怎么办? curl -X POST -d ' "endPoint": "customers"' -H 'Content-Type: application/json' woocommerce-api-samarthagarwal-1.c9users.io/api cUrl在服务器上显示了customers。我可以使用中间件将该标头添加到每个请求中吗?实际上,如果我在 Angular 代码中添加标头,我会收到预检错误。 【参考方案1】:

您需要将bodyParser 注册为中间件,否则它将不知道如何解析正文。这个中间件需要在定义任何路由之前出现。

如果不将bodyParser 注册为中间件,您的request.body 将始终为。因此,在执行request.body.customer 时,值将是undefined,并且您的整个console.log() 语句不会打印到控制台。

Example of body-parser usage from docs

var express = require('express');
var bodyParser = require("body-parser");
var app = express();

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

app.post('/api', function(req, res)
    res.setHeader("Access-Control-Allow-Origin", "*");
    console.log("body " + JSON.stringify(req.body, null, 2));
    var endPoint = req.body.endPoint;
    console.log("POST on " + endPoint + " with Data " + (req.body.customer));
);


var port = process.env.PORT;
var ip = process.env.IP
app.listen(port, ip,  function () 
  console.log('Server listening on ' + ip +':' + port);
);

【讨论】:

这是body-parser的使用方法,所以请确保它实际安装正确,npm install --save body-parser 我用你的重新安装并更新了代码。仍然为JSON.stringify(request.body) 获得 @SamarthAgarwal 我清理了你的路线并用它更新了我的答案。看看有没有帮助。 我认为您没有收到 Content-Type: application/json 标头 我可以使用中间件在每个请求上添加标头吗?【参考方案2】:

我必须使用中间件为每个请求手动设置标头。

app.use(function(req, res, next) 
    req.headers['content-type'] = "application/json";
    next();
);

我在所有要求之后才使用此代码。 这应该是第一个工作的中间件。我希望它可以帮助像我这样的人。

【讨论】:

以上是关于请求不使用正文解析器显示数据的主要内容,如果未能解决你的问题,请参考以下文章

不推荐使用正文解析器

正文解析器节点模块返回“已弃用”消息[重复]

如何检测 Http 请求的结束?

如何在快速路由器中使用正文解析器?

DRF - 解析器组件

DRF的解析器和渲染器