2016-07-10 77 views
0

我用快递,我想审计响应后,我把它快速响应体之后发送

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

你是不是指'req.body'? – Iceman

+0

不,我需要记录我发送给用户的响应 –

+0

把完整的代码放在这里。 – Iceman

回答

1

尽管我意识到响应主体不仅仅像响应属性一样可用,

因此: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。

+0

我会试试这个!我还发现了一个建议,在res对象res.bodyForAudit = bodyToSend上添加一个属性,然后在到达中间件时读取它。你怎么看? –

+0

你可以,但你必须按照上面的方式阅读它。我只写了一个更通用的soln的原因是为了让其他人可以将它用于不同的目的。 – Iceman

-2

尝试req.body而不是res.body

+0

看到我的编辑,我想在发送之后阅读回复的正文 –