tutorial proyecto node crear app node.js express

node.js - proyecto - Express función siguiente, ¿para qué es realmente?



npm (4)

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

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

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

El enrutador es especial, es un middleware que le permite ejecutar uno o más middleware para una determinada url. Entonces es una pila dentro de una pila.

Entonces, ¿qué sigue hacer? Simple, le dice a su aplicación que ejecute el siguiente middleware. Pero, ¿qué pasa cuando pasa algo a la próxima? Express abortará la pila actual y ejecutará todo el middleware que tenga 4 parámetros.

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

Este middleware se usa 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é el error real.

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

Si visualizas tu aplicación Express.js como una pila, probablemente puedas arreglar muchas rarezas tú mismo. Por ejemplo, cuando agrega su middleware de Cookie después de enrutar, tiene sentido que sus rutas no tengan cookies.

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 la next(''route'') puede usarse 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 describe la next función?


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

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á esto impreso en la consola:

before request handler handling request after request handler

Ahora si comenta la llamada a next() en el controlador del 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

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

Por lo tanto, realmente no importa si su manejador "principal" (el que devuelve 200) fue exitoso o no, si desea que se ejecute el resto 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 fue exitosa 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 devolución de llamada del primer controlador. Tienes que decirlo llamando a next() .


next () sin parámetro invoca el siguiente controlador de ruta en framework.


next() sin argumentos dice "es broma, realmente no quiero manejar esto". Vuelve atrás e intenta encontrar la siguiente ruta que coincida.

Esto es útil, por ejemplo, si desea tener algún tipo de administrador de página con barras 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() { //... });

Ese código inventado debería verificar una base de datos para una página con una cierta bala de identificación. ¡Si encuentra uno, renderízalo! si no encuentra uno, ignore este manejador de ruta y busque otros.

Así que next() sin argumentos permite fingir que no manejó la ruta para que otra persona pueda retomarla.

O un contador de app.all(''*'') con app.all(''*'') . Lo que le permite ejecutar algún 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() { //... });