Подтвердить что ты не робот

Как записать событие "конец ответа" в node.js + express?

Я хотел бы написать функцию промежуточного программного обеспечения, которая устанавливает слушателя в случае ответа "конец", если таковой существует. Целью является очистка на основе кода ответа HTTP, который конечный обработчик решил отправить, например. протоколирование кода ответа и откат/фиксация транзакции db. то есть, я хочу, чтобы эта очистка была прозрачной для вызывающего абонента.

Я хотел бы сделать что-то вроде выражения в выражении:

Маршрутное промежуточное ПО

function (req, res, next) {
   res.on ('end', function () {
      // log the response code and handle db
      if (res.statusCode < 400) { db.commit() } else { db.rollback() }
   });
   next();
}

Маршрут:

app.post ("/something", function (req, res) { 
    db.doSomething (function () {
       if (some problem) {
          res.send (500);
       } else {
          res.send (200);
       }
    });
 }

Когда я пытаюсь это сделать, обработчик события "end" никогда не будет вызван. То же самое для res.on('close'), о котором я читал в другом посте. Устраивают ли такие мероприятия?

Единственный другой способ, которым я могу это сделать, - обернуть res.end или res.send моей собственной версией в специальном промежуточном программном обеспечении. Это не идеально, потому что res.end и res.send не принимают обратные вызовы, поэтому я не могу просто их обернуть, вызвать оригинал, а затем сделать свое дело на основе кода ответа, который был установлен, когда они меня перезвонили ( потому что они меня не перезвонят).

Есть ли простой способ сделать это?

4b9b3361

Ответ 1

Считывая документацию, вот подпись res.send:

res.send(body|status[, headers|status[, status]])

Это означает, что вы можете установить свой собственный статус, например: res.send( 'some string', 200 ); или даже просто res.send( 404 );.

Этот метод используется для отправки ответа.

Как только он отправляется клиенту, вы больше не сможете его получить, поэтому обратного вызова нет.

Это последнее, что делает ваш сервер. После обработки запроса он отправляет ответ.

Однако вы можете получить к нему доступ, прежде чем отправлять его клиенту. Это означает, что вы можете:

console.log( res );
res.send( datas );

Если вы хотите откат/фиксацию, вы делаете это, когда вызывается обратный вызов базы данных, а не когда ответ ушел.

Ответ 2

Как ни странно, похоже, что ответ выдает событие "завершение", когда ответ закрыт: http://sambro.is-super-awesome.com/2011/06/27/listening-for-end-of-response-with-nodeexpress-js/

Несмотря на то, что эта запись в блоге немного устарела, это событие все еще существует (строка 836 в lib/http.js), поэтому я предполагаю, что это не скоро исчезнут, хотя ни одна из них не упоминает об этом. К началу 2014 года он переместился в строка 504 на lib/_http_outgoing.js и продолжает работать.

Кстати, событие "ошибка" в ответе сервера, вероятно, не то, что вы обычно хотели бы видеть.

Ответ 3

Просто для дальнейшего ответа @Aatatsuyu, вот как это должно выглядеть:

res.on('finish', function() {
  // do stuff here
});