我看过node.js Extracting POST data。
但这是我的问题,当我收到类似这样的HTTP请求时,如何使用Express 提取POST数据?
POST /messages HTTP/1.1
Host: localhost:3000
Connection: keep-alive
Content-Length: 9
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5
Content-Type: application/xml
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4 Accept-Charset: UTF-8,*;q=0.5
msg=hello
我似乎无法通过Express获取msg=hello
键值对。
我已尝试过所有这些方法req.header()
req.param()
req.query()
req.body
,但它们似乎是空的。
如何获取正文的内容?
app.post('/messages', function (req, res) {
req.??
});
答案 0 :(得分:3)
你的问题是bodyParser没有处理'application / xml',我主要是通过阅读这篇文章来解决这个问题:https://groups.google.com/forum/?fromgroups=#!topic/express-js/6zAebaDY6ug
你需要编写自己的解析器,我已经向github发布了以下更多细节:
<强> https://github.com/brandid/express-xmlBodyParser 强>
var utils = require('express/node_modules/connect/lib/utils', fs = require('fs'), xml2js = require('xml2js');
function xmlBodyParser(req, res, next) {
if (req._body) return next();
req.body = req.body || {};
// ignore GET
if ('GET' == req.method || 'HEAD' == req.method) return next();
// check Content-Type
if ('text/xml' != utils.mime(req)) return next();
// flag as parsed
req._body = true;
// parse
var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function(){
parser.parseString(buf, function(err, json) {
if (err) {
err.status = 400;
next(err);
} else {
req.body = json;
next();
}
});
});
}
然后将其与
一起使用app.use (xmlBodyParser);
答案 1 :(得分:2)
如果你在配置中有这个:
app.use(express.bodyParser());
这在你看来:
form(name='test',method='post',action='/messages')
input(name='msg')
然后这应该有效:
app.post('/messages', function (req, res) {
console.log(req.body.msg);
//if it's a parameter then this will work
console.log(req.params.msg)
});
答案 2 :(得分:0)
我认为您需要配置express才能使用bodyParser
中间件。
app.use(express.bodyParser());
见快递documentation。
它说:
例如,我们可以发布一些json,并使用bodyParser中间件回显json,该中间件将解析json请求主体(以及其他),并将结果放在req.body中
req.body()
现在应该返回预期的帖子。
我希望这有帮助!
答案 3 :(得分:0)
它可能(不确定它依赖于什么,但它发生在我身上,可能是bodyParser)请求体的格式化方式使得您的JSON数据被ITSELF视为密钥中的密钥 - 值对,具有空白对应值。在这种情况下,对我有用的是先提取JSON对象,然后照常进行:
var value;
for (var item in req.body)
{
var jObject = JSON.parse(item);
if (jObject.valueYouWant != undefined)
{
value = jObject.valueYouWant;
}
}
这可能是非常不理想的,但如果没有其他工作(我试图寻找更好的方法并且没有找到),这可能适合你。
答案 4 :(得分:0)
我正在发布xml,我得到的答案基于JSON输入。如果要显示xml的内容,请处理原始请求:
app.post('/processXml',function (req, res)
{
var thebody = '';
req.on('data' , function(chunk)
{
thebody += chunk;
}).on('end', function()
{
console.log("body:", thebody);
});
});
作为邮递员使用curl的例子:
curl -d '<myxml prop1="white" prop2="red">this is great</myxml>' -H
"Content-type: application/xml" -X POST
http://localhost:3000/processXml
对外输出:
'<myxml prop1="white" prop2="red">this is great</myxml>'
确保您的身体解析器中间件不会妨碍:body-parser-xml将您的请求对象动态处理到json对象,之后您将无法再处理原始请求。 (你可以猜到在这之后几个小时被卡住的人......)