Expresa la siguiente función, ¿para qué sirve realmente?

He estado tratando de encontrar una buena descripción de lo que hace el método next() . En la documentación de Express dice que next('route') se puede usar para saltar a esa ruta y omitir todas las rutas intermedias, pero a veces se llama a la next sin argumentos. ¿Alguien sabe de un buen tutorial, etc. que describa la next función?

next() sin argumentos dice “es broma, no quiero manejar esto”. Vuelve y trata de encontrar la siguiente ruta que coincida.

Esto es útil, por ejemplo, si desea tener algún tipo de administrador de página con slugs de URL, así como muchas otras cosas, pero aquí hay un ejemplo.

 app.get('/:pageslug', function(req, res, next){ var page = db.findPage(req.params.pageslug); if (page) { res.send(page.body); } else { next(); } }); app.get('/other_routes', function() { //... }); 

El código compuesto debe verificar una base de datos para una página con un cierto número de identificación. ¡Si lo encuentra uno lo rinde! Si no encuentra uno, ignore este controlador de ruta y busque otros.

Así que next() sin argumentos permite fingir que no manejó la ruta para que otra cosa pueda tomarla en su lugar.


O un contador de app.all('*') con app.all('*') . Lo que le permite ejecutar un código de configuración compartido y luego pasar a otras rutas para hacer algo más específico.

 app.all('*', function(req, res, next){ myHitCounter.count += 1; next(); }); app.get('/other_routes', function() { //... }); 

En la mayoría de los marcos, recibe una solicitud y desea devolver una respuesta. Debido a la naturaleza asíncrona de Node.js, tiene problemas con devoluciones de llamadas anidadas si está haciendo cosas no triviales. Para evitar que esto suceda, Connect.js (antes de v4.0, Express.js era una capa encima de connect.js) tiene algo que se llama middleware, que es una función con 2, 3 o 4 parámetros.

 function (, req, res, next) {} 

Su aplicación Express.js es una stack de estas funciones.

introduzca la descripción de la imagen aquí

El enrutador es especial, es un software intermedio que le permite ejecutar uno o más progtwigs intermedios para una determinada URL. Así que es una stack dentro de una stack.

Entonces, ¿qué hace el siguiente? Simple, le dice a su aplicación que ejecute el siguiente middleware. Pero, ¿qué pasa cuando pasas algo a la siguiente? Express abortará la stack actual y ejecutará todo el middleware que tiene 4 parámetros.

 function (err, req, res, next) {} 

Este middleware se utiliza para procesar cualquier error. Me gusta hacer lo siguiente:

 next({ type: 'database', error: 'datacenter blew up' }); 

Con este error, probablemente le diría al usuario que algo salió mal y registraría el error real.

 function (err, req, res, next) { if (err.type === 'database') { res.send('Something went wrong user'); console.log(err.error); } }; 

Si imaginas tu aplicación Express.js como una stack, probablemente puedas arreglar muchas cosas por tu cuenta. Por ejemplo, cuando agrega su middleware Cookie después de su enrutador, tiene sentido que sus rutas no tengan cookies.

En mi humilde opinión, la respuesta aceptada a esta pregunta no es realmente precisa. Como han dicho otros, realmente se trata de controlar cuándo se ejecuta el siguiente manejador de la cadena. Pero quería proporcionar un poco más de código para hacerlo más concreto. Digamos que tienes esta aplicación expresa simple:

 var express = require('express'); var app = express(); app.get('/user/:id', function (req, res, next) { console.log('before request handler'); next(); }); app.get('/user/:id', function (req, res, next) { console.log('handling request'); res.sendStatus(200); next(); }); app.get('/user/:id', function (req, res, next) { console.log('after request handler'); next(); }); app.listen(3000, function () { console.log('Example app listening on port 3000!') }); 

Si lo haces

 curl http://localhost:3000/user/123 

Verás esto impreso a consola:

 before request handler handling request after request handler 

Ahora, si comentas la llamada a next() en el controlador medio de esta manera:

 app.get('/user/:id', function (req, res, next) { console.log('handling request'); res.sendStatus(200); //next(); }); 

Verás esto en la consola:

 before request handler handling request 

Observe que el último controlador (el que se imprime after request handler ) no se ejecuta. Eso es porque ya no le está diciendo a Express que ejecute el siguiente controlador.

Entonces, realmente no importa si su manejador “principal” (el que devuelve 200) tuvo éxito o no, si desea que se ejecuten el rest de los middlewares, debe llamar a next() .

¿Cuándo sería útil esto? Supongamos que desea registrar todas las solicitudes que ingresaron en alguna base de datos, independientemente de si la solicitud tuvo éxito o no.

 app.get('/user/:id', function (req, res, next) { try { // ... } catch (ex) { // ... } finally { // go to the next handler regardless of what happened in this one next(); } }); app.get('/user/:id', function (req, res, next) { logToDatabase(req); next(); }); 

Si desea que se ejecute el segundo controlador, debe llamar a next() en el primer controlador.

Recuerde que el nodo es asíncrono, por lo que no puede saber cuándo finalizó la callback del primer controlador. Tienes que decirlo llamando al next() .

next () sin parámetro invoca el siguiente controlador de ruta O el siguiente middleware en el marco.

La pregunta también preguntó sobre el uso de next (‘route’), que parece estar cubierto durante la semana en las respuestas proporcionadas hasta el momento:

  1. USO DE next ():

En resumen: la siguiente función de middleware.

Extraiga de esta documentación oficial de Express JS – página ‘writing-middleware’ :

“La función de middleware myLogger simplemente imprime un mensaje, luego pasa la solicitud a la siguiente función de middleware en la stack llamando a la función next ()”.

 var express = require('express') var app = express() var myLogger = function (req, res, next) { console.log('LOGGED') next() } app.use(myLogger) app.get('/', function (req, res) { res.send('Hello World!') }) app.listen(3000) 

Esta página de la documentación de Express JS dice: “Si la función de middleware actual no finaliza el ciclo de solicitud-respuesta, debe llamar a next () para pasar el control a la siguiente función de middleware. De lo contrario, la solicitud quedará colgada”.

  1. USO DE LA SIGUIENTE (‘ruta’):

En resumen: la siguiente ruta (vs. la función de middleware siguiente en el caso de next ())

Extraiga de esta documentación de Express JS – página de ‘using-middleware’ :

“Para omitir el rest de las funciones de middleware de una stack de middleware de enrutador, llame a next (‘route’) para pasar el control a la siguiente ruta . NOTA: next (‘route’) funcionará solo en las funciones de middleware que se cargaron usando el Funciones de app.METHOD () o router.METHOD ().

Este ejemplo muestra una sub-stack de middleware que maneja las solicitudes GET a la ruta / user /: id “.

 app.get('/user/:id', function (req, res, next) { // if the user ID is 0, skip to the next route if (req.params.id === '0') next('route') // otherwise pass the control to the next middleware function in this stack else next() }, function (req, res, next) { // render a regular page res.render('regular') }) // handler for the /user/:id path, which renders a special page app.get('/user/:id', function (req, res, next) { res.render('special') })