如何访问expressjs给我的请求对象的原始主体?
var express = require('./node_modules/express');
var app = express.createServer();
app.post('/', function(req, res)
{
console.log(req.body); //says 'undefined'
});
app.listen(80);
Run Code Online (Sandbox Code Playgroud)
ste*_*ewe 54
这样的事情应该有效:
var express = require('./node_modules/express');
var app = express.createServer();
app.use (function(req, res, next) {
var data='';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.body = data;
next();
});
});
app.post('/', function(req, res)
{
console.log(req.body);
});
app.listen(80);
Run Code Online (Sandbox Code Playgroud)
Zug*_*alt 34
使用bodyParser.text()中间件将文本正文放入req.body.
app.use(bodyParser.text({type: '*/*'}));
Run Code Online (Sandbox Code Playgroud)
如果要将文本正文处理限制为某些路径或发布内容类型,您也可以这样做.
app.use('/routes/to/save/text/body/*', bodyParser.text({type: 'text/plain'})); //this type is actually the default
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
Run Code Online (Sandbox Code Playgroud)
如果你想要原料Buffer,你可以使用bodyParse.raw().
app.use(bodyParser.raw({type: '*/*'}));
Run Code Online (Sandbox Code Playgroud)
注意:这个答案是针对节点v0.12.7,表达4.13.2和正文解析器1.13.3进行测试的.
Ben*_*air 27
将以下中间件放在bodyParser中间件之前.它将在request.rawBody中收集原始身体数据,不会干扰bodyParser.
app.use(function(req, res, next) {
var data = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
next();
});
});
app.use(express.bodyParser());
Run Code Online (Sandbox Code Playgroud)
log*_*yth 20
express除非您添加中间件,否则默认不会缓冲数据.简单的解决方案是遵循@ Stewe下面的答案中的示例,它将自己连接所有数据.例如
var concat = require('concat-stream');
app.use(function(req, res, next){
req.pipe(concat(function(data){
req.body = data;
next();
}));
});
Run Code Online (Sandbox Code Playgroud)
这样做的缺点是,您现在已将所有POST正文内容作为连续的块移动到RAM中,这可能不是必需的.另一个值得考虑的选项,但取决于您需要在帖子正文中处理多少数据,而是将数据作为流处理.
例如,使用XML,您可以使用支持解析XML的XML解析器,因为它以块的形式出现.一个这样的解析器是XML Stream.你做这样的事情:
var XmlStream = require('xml-stream');
app.post('/', function(req, res) {
req.setEncoding('utf8');
var xml = new XmlStream(req);
xml.on('updateElement: sometag', function(element) {
// DO some processing on the tag
});
xml.on('end', function() {
res.end();
});
});
Run Code Online (Sandbox Code Playgroud)
所有的答案似乎都已经过时了,如果有人仍在为此苦苦挣扎,那么 Express 内置了Express raw middeware。
此中间件在 Express v4.16.0 及更高版本中可用。这是Express中内置的中间件功能。它使用 JSON 有效负载解析传入请求,并且基于 body-parser。
var express = require("express");
var app = express();
app.use(express.raw({ type: "*/*" }))
app.post("/", (req, res) => {
// req.body = JSON.parse(req.body); // To parse JSON if needed (in-case)
console.log(req.body);
res.end();
});
app.listen(3000, (err) => {
if(!err) console.log("App running!!")
});
Run Code Online (Sandbox Code Playgroud)
因此,如果content-type设置为以下任一项,Express的bodyParser似乎只解析传入的数据:
application/x-www-form-urlencodedapplication/jsonmultipart/form-data在所有其他情况下,它甚至不打扰阅读数据.
你可以换行号.92的express/node_modules/connect/lib/middleware/bodyParser.js来自
} else {
next();
}
Run Code Online (Sandbox Code Playgroud)
至:
} else {
var data='';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
next();
});
}
Run Code Online (Sandbox Code Playgroud)
然后,req.rawBody从您的代码中读取.
app.use(bodyParser.json({
verify: function (req, res, buf, encoding) {
req.rawBody = buf;
}
}));
app.use(bodyParser.urlencoded({
extended: false,
verify: function (req, res, buf, encoding) {
req.rawBody = buf;
}
}));
Run Code Online (Sandbox Code Playgroud)
现在这似乎变得容易了很多!
body-parser 模块现在能够解析原始数据和文本数据,这使得任务成为单线任务:
app.use(bodyParser.text({type: 'text/plain'}))
Run Code Online (Sandbox Code Playgroud)
或者
app.use(bodyParser.raw({type: 'application/binary'}))
Run Code Online (Sandbox Code Playgroud)
这两行都只是简单地填充了body属性,所以用res.body.
bodyParser.text()会给你 UTF8 字符串,同时bodyParser.raw()会给你原始数据。
这是文本/纯数据的完整代码:
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
app.use(bodyParser.text({type: 'text/plain'}))
app.post('/', function (req, res, next) {
console.log('body:\n' + req.body)
res.json({msg: 'success!'})
next()
})
Run Code Online (Sandbox Code Playgroud)
有关完整文档,请参见此处:https : //www.npmjs.com/package/body-parser
我使用了 express 4.16 和 body-parser 1.18
如果您在使用上述解决方案时遇到问题干扰正常的帖子请求,这样的事情可能会有所帮助:
app.use (function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) { req.rawBody += chunk });
});
Run Code Online (Sandbox Code Playgroud)
更多信息和来源:https://github.com/visionmedia/express/issues/897#issuecomment-3314823
如果您希望身体作为缓冲:
var rawParser = function(req, res, next) {
var chunks = [];
req.on('data', function(chunk) {
chunks.push(chunk)
});
req.on('end', function() {
req.body = Buffer.concat(chunks);
next();
});
}
Run Code Online (Sandbox Code Playgroud)
要么
var rawParser = bodyParser.raw({type: '*/*'});
Run Code Online (Sandbox Code Playgroud)
然后:
app.put('/:name', rawParser, function(req, res) {
console.log('isBuffer:', Buffer.isBuffer(req.body));
})
Run Code Online (Sandbox Code Playgroud)
或所有路线:
app.use(bodyParser.raw({type: '*/*'}));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58492 次 |
| 最近记录: |