Cuándo usar next () y devolver next () en el nodo.js


Escenario : Considere lo siguiente es la parte del código de una aplicación web de nodo.

app.get('/users/:id?', function(req, res, next){
    var id = req.params.id;
    if (id) {
        // do something
    } else {
        next(); //or return next();
    }
});

Problema : Estoy comprobando con cuál ir solo next() o return next(). El código de ejemplo anterior funciona exactamente igual para ambos y no mostró ninguna diferencia en la ejecución.

Pregunta : ¿Puede alguien aclarar esto, cuándo usar next() y cuándo usar return next() y alguna diferencia importante?

Author: Amol M Kulkarni, 2013-05-29

3 answers

Algunas personas siempre escriben return next() es para asegurarse de que la ejecución se detenga después de activar la devolución de llamada.

Si no lo hace, corre el riesgo de activar la devolución de llamada una segunda vez más tarde, lo que generalmente tiene resultados devastadores. Su código está bien como está, pero lo reescribiría como:

app.get('/users/:id?', function(req, res, next){
    var id = req.params.id;

    if(!id)
        return next();

    // do something
});

Me guarda un nivel de sangría, y cuando leo el código de nuevo más tarde, estoy seguro de que no hay manera de que next se llame dos veces.

 87
Author: Laurent Perrin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-30 13:01:50

Como respuesta de @ Laurent Perrin:

Si no lo hace, corre el riesgo de desencadenar la devolución de llamada una segunda vez más tarde, lo que generalmente tiene resultados devastadores

Doy un ejemplo aquí si escribes middleware como este:

app.use((req, res, next) => {
  console.log('This is a middleware')
  next()
  console.log('This is first-half middleware')
})

app.use((req, res, next) => {
  console.log('This is second middleware')
  next()
})

app.use((req, res, next) => {
  console.log('This is third middleware')
  next()
})

Descubrirá que la salida en la consola es:

This is a middleware
This is second middleware
This is third middleware
This is first-half middleware

Es decir, ejecuta el código de abajo next() después de que toda la función de middleware haya terminado.

Sin embargo, si usa return next(), saltará la devolución de llamada inmediatamente y el código debajo de return next() en la devolución de llamada será inalcanzable.

 70
Author: PJCHENder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-14 02:01:22

next() es parte de connect middleware . Las devoluciones de llamada para el flujo del enrutador no le importa si devuelve algo de sus funciones, por lo que return next() y next(); return; es básicamente lo mismo.

En caso de que desee detener el flujo de funciones, puede usar next(err) como lo siguiente

app.get('/user/:id?', 
    function(req, res, next) { 
        console.log('function one');
        if ( !req.params.id ) 
            next('No ID'); // This will return error
        else   
            next(); // This will continue to function 2
    },
    function(req, res) { 
        console.log('function two'); 
    }
);

Bastante next() se utiliza para extender el middleware de sus solicitudes.

 42
Author: drinchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-01 10:07:14