发送后快递响应体

时间:2016-07-10 15:15:24

标签: node.js express

我使用快递我想在发送后审核回复

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
};
...

知道为什么吗?

2 个答案:

答案 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