Tener dificultades para entender ‘next / next ()’ en express.js

Este es un ejemplo de esto:

// 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 aqui esta otro:

 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 bloc de notas construido en el nodo

Estas son las preguntas que me desconciertan:

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

EDITAR:

Express usa funciones de middleware que tienen devoluciones de llamada (funciones a las que se llama cuando se completa una acción), y luego tiene ese propósito (es una callback que desencadena el siguiente middleware en la stack Express). Todo el middleware Express (que es compatible con Connect) tiene 3 params: request, response, next (que es opcional).

Por ejemplo, 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 arriba es parte de eso).

Cada middleware puede completar su tarea y llamar al next middleware 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 sí mismo para servir los archivos, de modo que el enrutador ganó ser llamado).

En el enrutador no suele llamar a next ya que tiende a ser el último middleware ejecutado (a menos que desee algo como benchmarking).

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

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

Editar: según su configuración, el enrutador se encuentra antes del middleware estático, por lo que si desea que se sirvan los archivos, debe declarar una ruta comodín que invoca a next () cuando la ruta no se corresponde:

 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.