2012-01-03 11 views
63

Este es un ejemplo de ello:Teniendo dificultades para tratar de entender 'siguiente/next()' en express.js

// Configuration 
app.configure(function(){ 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
}); 

(etc.)

app.get('/memo', function(req, res) { 
    console.log("index"); 
    Memo.find({}, function(err, data) { 
    if(err) return next(err); 
    res.render('index', { memos: data }); 
    }); 
}); 

Y aquí es otra uno:

app.get('/memo/list', function(req, res, next) { 
    console.log("get memos"); 
    Memo.find({}, function(err, data) { 
    if(err) return next(err); 
    res.json(data); 
    }); 
}); 

Tomado de un simple memo pad built on node

Estas son las preguntas que me desconciertan:

  1. ¿Qué significa exactamente next/next(); hacer? ¿Qué pasaría si no está presente?
  2. ¿Por qué la segunda parte toma next como parámetro y la primera no?

EDIT:

Respuesta

92

Express utiliza funciones de middleware que tienen devoluciones de llamada (funciones que serán llamadas cuando se ha completado una acción), y al lado tiene ese propósito (es una devolución de llamada que desencadena la próxima middleware en la pila Express) . Todo el middleware Express (que es compatible con Connect) tiene 3 params: request, response, next (que es opcional).

Por ejemplo, el middlware estático sirve archivos estáticos, el middleware csrf busca un param cuando recibe solicitudes POST y el middleware del enrutador que maneja las rutas (lo que ha pegado anteriormente es parte de eso).

Cada middleware puede completar su tarea y llamar al middleware next en la cola si se cumplen algunas condiciones (por ejemplo, el middleware estático no llamará a un middleware siguiente, ya que se encargará de servir los archivos, por lo que que no se llamará al enrutador).

En el enrutador no suele llamar al next porque tiende a ser el último middleware ejecutado (a menos que desee algo así como la evaluación comparativa).

Si desea crear un middleware que niega el acceso a todos los usuarios que no han iniciado sesión, debe llamar al next() solo si el usuario ha iniciado sesión (para que se llame al siguiente middleware, el enrutador de este caso y el usuario puede acceder a la página que están buscando), de lo contrario, probablemente los redirigiría a la página de inicio de sesión.

next no toma ningún parámetro o un error como parámetro.

edición: función de la configuración del router es antes de que el middleware estática, por lo que si desea que los archivos para ser servido tiene que declarar una ruta comodín que llama a next() cuando la ruta no se corresponde con:

app.get('*', function (req, res, next) { 
    // no route is matched 
    // so call next() to pass to the static middleware 
    next(); 
}); 

Nota: No recomiendo que coloque el servidor de archivos estáticos después del enrutador, le sugiero que lo coloque antes para que pueda definir sus propias rutas 404 personalizadas.

+0

Entonces 'siguiente' llama al siguiente middleware dentro de' app.configure'? Por ejemplo, 'bodyParser -> methodOverride -> etc' para esa particular' app.get'? (Por favor, vea el código adicional que agregué a la parte superior). – alexchenco

+2

Sí de hecho, el orden de la configuración.El middleware entra en una cola y se llaman secuencialmente usando next(). – alessioalex

+0

Para ser claros, en la primera instancia, 'app.get ('/ memo', function (req, res) {...});' el método next() está automáticamente presente, incluso si no está declarado en ' función (req, res) '? – prototype

Cuestiones relacionadas