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 cuál elegir con 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 : ¿Alguien puede aclarar esto, cuándo usar next()
y cuándo usar return next()
y alguna diferencia importante?
res.redirect('/')
vs.return res.redirect('/')
en este tipo de situación? ¿Quizás es mejor escribir siempre el retorno frente a las declaraciones de resolución para evitar errores de configuración de encabezados después de enviarlos?Como la respuesta de @Laurent Perrin:
Doy un ejemplo aquí si escribes middleware como este:
Descubrirá que la salida en la consola es:
Es decir, ejecuta el siguiente código next () después de que termine toda la función de middleware.
Sin embargo, si lo usa
return next()
, saltará la devolución de llamada inmediatamente y el código siguientereturn next()
en la devolución de llamada no será accesible.fuente
express
esta respuesta me dejó las cosas más claras que las otras respuestas. ¡Pulgares hacia arriba!res.redirect('/')
vs.return res.redirect('/')
en este tipo de situación? ¿Quizás es mejor escribir siemprereturn
delante de lasres
declaraciones para evitar errores de configuración de encabezados después de que se envían?next()
es parte de conectar middleware . A las devoluciones de llamada para el flujo del enrutador no le importa si devuelve algo de sus funciones, así quereturn next()
ynext(); return;
es básicamente el mismo.En caso de que desee detener el flujo de funciones, puede usar
next(err)
como lo siguientePrácticamente
next()
se usa para extender el middleware de sus solicitudes.fuente
next('No ID')
:?next('No ID')
en realidad está enviando un error, que interrumpirá el flujo.¡Es mejor no usarlo en absoluto! Lo explico, y eso es lo que hago también lo explico.
La función next () que puede tener cualquier nombre y, por convención, se ha establecido en next. Está indirectamente relacionado con las operaciones (PUT, GET, DELETE, ...) que generalmente se realizan en el mismo recurso URI, por ejemplo
/ user /: id
Ahora, si observa app.get, app.put y app.delete usan la misma uri (/ user /: id), lo único que las diferencia es su implementación. Cuando se realiza la solicitud (req) express coloca la solicitud primero en app.get, si falla cualquier validación que haya creado porque esa solicitud no es para ese controlador, pasa la solicitud a app.put que es la siguiente ruta en el archivo y así en. Como se ve en el ejemplo a continuación.
El problema radica en que, al final, terminas pasando la solicitud a todos los controladores con la esperanza de que haya una que haga lo que quieras, mediante la validación de la solicitud. Al final, todos los controladores terminan recibiendo algo que no es para ellos :(.
Entonces, ¿cómo evitar el problema de next () ?
La respuesta es realmente simple.
1- solo debe haber una uri para identificar un recurso
http: // IpServidor / colection /: resource / colection /: resource si su URI es más largo que eso, debería considerar crear una nueva uri
Ejemplo http: // IpServidor / users / pepe / contactos / contacto1
2-Todas las operaciones en este recurso deben realizarse respetando la idempotencia de los verbos http (get, post, put, delete, ...) para que la llamada a un URI realmente solo tenga una forma de llamar
Más información [ https://docs.microsoft.com/es-es/azure/architecture/best-practices/api-design#organize-the-api-around-resourcesfont>[1]
¡Veamos el código! ¡La implementación concreta que nos hace evitar el uso de next ()!
En el archivo index.js
En el archivo usersRoute.js
Ahora el archivo usersRoute.js hace lo que se espera que haga un archivo llamado usersRoute, que es administrar las rutas del URI / users /
// archivo getUsersController.js
De esta forma, evita el uso de next, desacopla el código, gana rendimiento, desarrolla SOLID, deja la puerta abierta para una posible migración a microservicios y, sobre todo, es fácil de leer por un programador.
fuente
Próximo() :
fuente