我使用快递我想在发送后审核回复
var app = express();
app.use(audit.auditRequest); // working fine
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(expressValidator({
customValidators: validations.customValidators,
customSanitizers: sanitizers.customSanitizers
}));
app.use(auth.authenticate);
app.use('/myPath', myPathHandler);
app.use(errorHandler.handleErrors);
**app.use(audit.auditResponse);**
例如,errorHandler看起来像这样:
...
res.status(500).send({ message : "abc", code: 5010, description : "def" });
next(); // call audit middleware
然后审计中间件看起来像这样:
...
auditModule.auditResponse = function auditResponse(req, res, next) {
auditLogger.info('Response', res.body);
// but res.body is undefined
};
...
知道为什么吗?
答案 0 :(得分:2)
尽管我意识到响应体不像响应中的属性那样容易获得。
所以:res.body
无法开始工作。所以,我有一个解决方法。我们可以从响应写入中捕获数据,累积它并手动将其添加到res.body中。将其注释为中间件,以便它可以工作。请注意,它应该在任何.compress()
之前注入。
注入中间件(这是在ES6&将直接在Node.js中工作,但如果你想我将改变ES5的答案):
server.use((req, res, next) => {
const original_write = res.write,
original_end = res.end,
chunks = [];
res.write = function(chunk) {
chunks.push(chunk);
original_write.apply(res, arguments);
};
res.end = function(chunk) {
if (chunk)
chunks.push(chunk);
res.body = Buffer.concat(chunks).toString('utf8');
original_end.apply(res, arguments);
};
next();
});
现在,您可以在发送回复后愉快地使用res.body
。 :d
注意: res.body
将是一个utf8编码的字符串。如果它是一个对象,请将其解析回json。
答案 1 :(得分:-3)
尝试使用req.body
代替res.body
。