2016-07-10 13 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

Насколько я знаю, тело ответа не просто доступно так же легко, как свойство на отклик.

So: 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 object-res.bodyForAudit = bodyToSend, а затем прочитать его при достижении промежуточного программного обеспечения. Как вы думаете? –

+0

вы можете, но вы должны прочитать его так же, как описано выше. Только причина, по которой я написал более общий soln, заключается в том, чтобы кто-то другой мог использовать его в будущем для другой цели. – Iceman

-2

Попробуйте req.body вместо res.body.

+0

См. Мое редактирование, я хочу прочитать тело ответа после того, как отправил его –

Смежные вопросы