Узел Express 4 промежуточного программного обеспечения после маршрутов

После обновления до Express 4 и удаления app.router я изо всех сил пытаюсь выполнить промежуточное программное обеспечение после выполнения маршрутов.

например, следующий код правильно отвечает "привет", но никогда не вызывает настроенное промежуточное ПО

var express = require( "express" )();

express.get( "/", function( req, res ) {

    res.send( "hello" );

} );
express.use( function( req, res, next ) {

    console.log( "world" );
    next();

} );

express.listen( 8888 );

ПОЯСНЕНИЯ:

следующий код показывает "до" на консоли, но не "после":

var express = require( "express" )();

express.use( function( req, res, next ) {

    console.log( "before" );
    next();

} );
express.get( "/", function( req, res ) {

    res.send( "hello" );

} );
express.use( function( req, res, next ) {

    console.log( "after" );
    next();

} );

express.listen( 8888 );

Ответы

Ответ 1

Что касается Express 4, функция "after" из вашего второго примера никогда не вызывается, потому что средняя функция никогда не вызывает next().

Если вы хотите, чтобы функция "после" вызывалась, вам нужно добавить и вызвать следующий обратный вызов из вашей средней функции следующим образом:

var express = require( "express" )();

express.use( function( req, res, next ) {

  console.log( "before" );
  next();

} );
express.get( "/", function( req, res, next ) {

  res.send( "hello" );
  next();      // <=== call next for following middleware 

} );
express.use( function( req, res, next ) {

  console.log( "after" );
  next();

} );

express.listen( 8888 );

res.send() записывает заголовки и возвращает ответ клиенту.

Помните, что после вызова res.send() вы не захотите обновлять заголовки или содержимое ответа. Но вы можете выполнять другие задачи, такие как обновление базы данных или ведение журнала.

Обратите внимание, что выражение выражает количество аргументов в функции промежуточного программного обеспечения и выполняет другую логику. Например, возьмите экспресс-обработчики ошибок, которые имеют 4 параметра.

выражать подпись обработчика ошибок: app.use(function(err, req, res, next) {});

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

Ответ 2

Правильный ответ заключается в res.on("finish", cb).

то есть:

express.use(function(req, res, next) {
    console.log("before");

    res.on("finish", function() {
        console.log("after");
    });

    next();
});

Ответ 3

Вы проверили, как поставить console.log после следующего() вызова?

express.use( function( req, res, next ) {
  next();
  console.log( "world" );
});
express.get( "/", function( req, res ) {
  res.send( "hello" );
});

Ответ 4

Заказ важен http://expressjs.com/4x/api.html#app.use

express.use( function( req, res, next ) {
  console.log( "world" );
  next();
});
express.get( "/", function( req, res ) {
  res.send( "hello" );
});

Ответ 5

Если вы можете работать с другой структурой, я предлагаю вам использовать ZinkyJS, у нее есть встроенный способ сделать это. Проверьте здесь: ZinkyJS ПОСЛЕ ХОКК