我正在使用nodejs + Express(v3):
app.use(express.bodyParser());
app.route('/some/route', function(req, res) {
var text = req.body; // I expect text to be a string but it is a JSON
});
我检查了请求标头,但缺少内容类型。即使“Content-Type”是“text / plain”,它也可以解析为JSON。反正有没有告诉中间件总是将正文解析为纯文本字符串而不是json?早期版本的req
曾经有req.rawBody
可以解决这个问题,但现在它不再存在了。什么是在Express中强制解析正文作为纯文本/字符串的最简单方法?
答案 0 :(得分:24)
在express 4.x中,您可以使用bodyParser中的文本解析器 https://www.npmjs.org/package/body-parser
只需添加app.js
即可app.use(bodyParser.text());
同样在期望的路线
router.all('/',function(req,res){
console.log(req.body);
})
答案 1 :(得分:24)
默认情况下bodyParser.text()
仅处理text / plain。更改类型选项以包含*/json
或*/*
。
app.use('/some/route', bodyParser.text({type: '*/*'}), function(req, res) {
var text = req.body; // I expect text to be a string but it is a JSON
});
//or more generally:
app.use(bodyParser.text({type:"*/*"}));
您可以找到文档here
答案 2 :(得分:21)
如果删除bodyParser()
中间件的使用,则应该是文本。您可以查看bodyParser
文档了解详情:http://www.senchalabs.org/connect/middleware-bodyParser.html
删除此行:
app.use(express.bodyParser());
看起来你是对的。您可以在此期间创建自己的rawBody
中间件。但是,您仍需要停用bodyParser()
。注意:req.body
仍为undefined
。
这是一个演示:
<强> app.js 强>
var express = require('express')
, http = require('http')
, path = require('path')
, util = require('util');
var app = express();
function rawBody(req, res, next) {
req.setEncoding('utf8');
req.rawBody = '';
req.on('data', function(chunk) {
req.rawBody += chunk;
});
req.on('end', function(){
next();
});
}
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.use(rawBody);
//app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
});
app.post('/test', function(req, res) {
console.log(req.is('text/*'));
console.log(req.is('json'));
console.log('RB: ' + req.rawBody);
console.log('B: ' + JSON.stringify(req.body));
res.send('got it');
});
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
<强> test.js 强>
var request = require('request');
request({
method: 'POST',
uri: 'http://localhost:3000/test',
body: {'msg': 'secret'},
json: true
}, function (error, response, body) {
console.log('code: '+ response.statusCode);
console.log(body);
})
希望这有帮助。
答案 3 :(得分:3)
您可以使用plainTextParser(https://www.npmjs.com/package/plaintextparser)中间件..
let plainTextParser = require('plainTextParser');
app.use(plainTextParser());
或
app.post(YOUR_ROUTE, plainTextParser, function(req, res) {
let text = req.text;
//DO SOMETHING....
});
答案 4 :(得分:1)
我做到了:
router.route('/')
.post(function(req,res){
var chunk = '';
req.on('data', function(data){
chunk += data; // here you get your raw data.
})
req.on('end', function(){
console.log(chunk); //just show in console
})
res.send(null);
})
答案 5 :(得分:1)
Express通过内容类型了解如何解码正文。 它必须在中间件中具有特定的解码器,该中间件已从 4.x :
嵌入到库中。app.use(express.text())
app.use(express.json())
答案 6 :(得分:0)
确保express和bodyParser的版本已升级到适当的版本。 表达〜4.x和bodyParser~1.18.x。应该这样做。有了这些,以下应该工作
app.use(bodyParser.text());
答案 7 :(得分:0)
要实现这一目标的两件重要事情。
这是两者的示例代码。
const express = require('express');
const app = express();
const bodyParser = require('body-parser')
//This is the needed text parser middleware
app.use(bodyParser.text());
app.post('/api/health/', (req, res) => {
res.send(req.body);
});
const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening on ${port} ${new Date(Date.now())}`));
将其另存为index.js。
安装依赖项。
npm i -S express
npm i -S body-parser
运行它。
node index.js
现在向其发送请求。
curl -s -XPOST -H "Content-type: text/plain" -d 'Any text or json or whatever {"key":value}' 'localhost:3000/api/health'
您应该可以看到它发回了您发布的所有内容。