kie*_*wic 5 node.js body-parser
我编写了一个 Express 中间件来从请求中检索原始正文,并将其设置在正文解析器中间件之前。
我的自定义中间件正在调用req.setEncoding('utf8'),但这会导致以下正文解析器错误:
错误:不应设置流编码
Run Code Online (Sandbox Code Playgroud)at readStream (/node_modules/body-parser/node_modules/raw-body/index.js:211:17) at getRawBody (/node_modules/body-parser/node_modules/raw-body/index.js:106:12) at read (/node_modules/body-parser/lib/read.js:76:3) at jsonParser (/node_modules/body-parser/lib/types/json.js:127:5)
这是我的代码:
var express = require('express');
var bodyParser = require('body-parser')
function myMiddleware() {
return function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
req.on('end', function() {
next();
});
}
}
var app = express();
app.use(myMiddleware());
app.use(bodyParser.json());
var listener = app.listen(3000, function() {
});
app.get('/webhook/', function (req, res) {
res.sendStatus(200);
});
Run Code Online (Sandbox Code Playgroud)
有没有办法取消编码?是否有另一种方法来检索原始正文,但在它之后仍然使用正文解析器?
kie*_*wic 10
事实证明,body-parser有一个验证选项,可以在读取请求正文时调用函数。该函数接收主体作为缓冲区。
下面是一个例子:
var express = require('express');
var bodyParser = require('body-parser')
function verifyRequest(req, res, buf, encoding) {
// The raw body is contained in 'buf'
console.log( buf.toString( encoding ) );
};
var app = express();
var listener = app.listen(3000);
// Hook 'verifyRequest' with body-parser here.
app.use(bodyParser.json({ verify: verifyRequest }))
app.post('/webhook/', function (req, res) {
res.status(200).send("done!");
});
Run Code Online (Sandbox Code Playgroud)
您next()在“完成”内部调用,这意味着流已经被消耗。相反,为“数据”设置处理程序,然后使用next(). “完成”事件很可能在内部处理,bodyParser因此在执行后您可以访问req.rawBody. 如果不是这种情况,您将添加另一个next()在 a 内部调用的中间件,req.on('done')以阻止其余部分的处理,直到您拥有所有数据。
// custom middleware - req, res, next must be arguments on the top level function
function myMiddleware(req, res, next) {
req.rawBody = '';
req.on('data', function(chunk) {
req.rawBody += chunk;
});
// call next() outside of 'end' after setting 'data' handler
next();
}
// your middleware
app.use(myMiddleware);
// bodyparser
app.use(bodyParser.json())
// test that it worked
function afterMiddleware(req, res, next) {
console.log(req.rawBody);
next();
}
app.use(afterMiddleware);
Run Code Online (Sandbox Code Playgroud)
如果您需要访问原始正文,您可能还想查看bodyParser.raw(). 这将放入原始正文req.body,与bodyParse.json()但可以根据内容类型有条件地运行 - 签出相同options.type。
| 归档时间: |
|
| 查看次数: |
7749 次 |
| 最近记录: |