这是我的Node Express代码,
(function () {
'use strict';
var fs = require('fs');
var cors = require('cors');
var bodyParser = require('body-parser');
var express = require('express'),
app = express(),
port = 8112;
app.use(cors());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.listen(port);
app.route('/abc')
.post(abc);
function abc(req,res){
console.dir(req.body);
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.sendStatus(200);
}
})();
但我得到了请求正文
{}
但在Chrome浏览器的网络标签中,我可以看到请求有效负载。 请注意在此POST调用之前触发OPTIONS。
请求标题
POST /abcHTTP/1.1主机:localhost:8112连接:
keep-alive Content-Length:11 Pragma:no-cache Cache-Control:no-cache
来源:http://localhost:4200用户代理:Mozilla / 5.0(Windows NT 10.0; Win64平台; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 66.0.3359.181 Safari / 537.36
X-API密钥:CExkxDlFC35ckfCGX6m61x76GxIYH2h2Iv8bX874
内容类型:文本/无格式;字符集= UTF-8
接受: / Referer: http://localhost:4200/dashboard Accept-Encoding:gzip,deflate,br
Accept-Language:en-US,en; q = 0.9
请求有效负载
{" DD":" DD"}
答案 0 :(得分:4)
您需要发送:Content-Type: application/json
才能使bodyParser.json()
正常工作,如果没有它,您的JSON有效负载将无法解析,这就是您获得的原因:{}
来自docs:
bodyParser对象公开了各种工厂来创建中间件。 所有中间件都将使用解析的方法填充req.body属性 当Content-Type请求标头与type选项匹配时,或者 如果没有要解析的主体,则为空对象({}),即Content-Type 未匹配,或发生错误。
使用.fetch
的示例:
fetch('http://localhost:4200/dashboard', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({dd: 'dd'})
});
答案 1 :(得分:0)
您的内容类型标题是text / plain。请尝试替换
app.use(bodyParser.json());
带
app.use(bodyParser.text());
答案 2 :(得分:0)
您好@Pradhaban Nandhakumar,我认为您必须将数据作为行数据传递。 请尝试以下代码段。
您应始终传递原始数据。
app.post('/users', (req, res) => {
res.send(req.body);
});
答案 3 :(得分:0)
您发布的是纯文本字符串而不是JSON。考虑向我们展示您如何发布数据(jQuery,Fetch API等)。
只需指定
即可headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
}
在您的请求标头中(前端)。然后,Express正文解析器应该能够检测到有效的JSON并打印结果。请注意,Accept
并非必需,但它会指示服务器客户端理解并接受JSON响应。
或者,在前端使用像Easy Fetch这样的简单库来管理服务器端调用,而不必处理响应解析或标头设置。
答案 4 :(得分:0)
这通常是由于您的http请求中的“ Content-type”标头引起的。
JSON体
bodyParser.json()仅接受“ application / json”类型,并拒绝其他不匹配的内容类型。
解决方案1:接受application/json
以外的其他内容类型
检查您的请求标头“ Content-type”,并将其添加到服务器中bodyParser.json([options])中的options参数中。
例如,如果您具有以下内容:
“内容类型:application / csp-report”
app.use(bodyParser.json({ type: ["application/json", "application/csp-report"] }));
您还可以使用自exprss v4.16.0起的内置中间件:
app.use(express.json({ type: ['application/json', 'application/csp-report'] }));
有关更多信息,请参见this documentation
注意:仅在无法将Content-type
更改为application/json
的情况下使用此方法。
解决方案2(推荐):在Http请求中将标题content-type
更改为application/json
。
黑体编码的尸体怎么样?
这类似于json正文,但有两个区别:
请求中接受的“内容类型”标头为“ application / x-www-form-urlencoded”
主体有效载荷是url编码格式(不是json对象):
格式: param_1 = value_1&param_2 = value_2&...
app.use(express.urlencoded({ extended: false }));
请参见docs。