pat*_*rit 34 json content-type connect node.js express
我正在使用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
});
Run Code Online (Sandbox Code Playgroud)
我检查了请求标头,但缺少内容类型.即使"Content-Type"是"text/plain",它也可以解析为JSON.反正有没有告诉中间件总是将正文解析为纯文本字符串而不是json?req过去的早期版本req.rawBody可以解决这个问题,但现在它已经不存在了.什么是在Express中强制解析正文作为纯文本/字符串的最简单方法?
小智 27
在express 4.x中,您可以使用bodyParser中的文本解析器 https://www.npmjs.org/package/body-parser
只需添加app.js
app.use(bodyParser.text());
Run Code Online (Sandbox Code Playgroud)
也在所需的路线
router.all('/',function(req,res){
console.log(req.body);
})
Run Code Online (Sandbox Code Playgroud)
Rag*_*ghu 25
默认情况下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:"*/*"}));
Run Code Online (Sandbox Code Playgroud)
你可以在这里找到文档
JP *_*son 22
如果删除bodyParser()中间件的使用,则应该是文本.您可以查看bodyParser文档以获取更多信息:http://www.senchalabs.org/connect/middleware-bodyParser.html
删除此行:
app.use(express.bodyParser());
Run Code Online (Sandbox Code Playgroud)
看起来你是对的.您可以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'));
});
Run Code Online (Sandbox Code Playgroud)
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);
})
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
dim*_*iax 11
Express 通过内容类型了解如何解码正文。它必须在中间件中有特定的解码器,从4.x嵌入到库中:
app.use(express.text())
app.use(express.json())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49610 次 |
| 最近记录: |