请求不使用正文解析器显示数据
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();
);
我在所有要求之后才使用此代码。 这应该是第一个工作的中间件。我希望它可以帮助像我这样的人。
【讨论】:
以上是关于请求不使用正文解析器显示数据的主要内容,如果未能解决你的问题,请参考以下文章