Salir después de res.send () en Express.js

Tengo una aplicación Express.js bastante simple con un componente de inicio de sesión que me gustaría salir antes si falla el inicio de sesión. Estoy viendo indicaciones de que la aplicación no está haciendo eso y no he encontrado una respuesta definitiva que indique si llamar a res.send() detiene cualquier procesamiento adicional. Aquí está mi código tal como está ahora:

 client.login( username, password, function( auth, client ) { if( !auth ) { res.send( 401 ); } // DO OTHER STUFF IF AUTH IS SUCCESSFUL } 

Si leo el código fuente correctamente, debería terminar la solicitud (abortando el procesamiento adicional), pero soy nuevo en el nodo, por lo que no estoy del todo preparado para confiar en lo que creo que estoy leyendo. Para resumir, supongo que estoy buscando una respuesta definitiva de una fuente más confiable que mi propia interpretación de un código fuente desconocido. Si send() no cancela el procesamiento, ¿cuál es la forma correcta de hacerlo?

Si está utilizando Express como su marco, debería llamar a next () en su lugar.

Cada controlador en Express recibe 3 parámetros (desvincula 2 para http básico) que son req , res y next

next es una función que cuando se llama sin argumentos activará el siguiente controlador en la cadena de middleware.

Si se llama a next con un argumento, este argumento se interpretará como un error, independientemente del tipo de ese argumento.

Su firma es la next([error]) . Cuando se llama a next con un error, en lugar de llamar al siguiente manejador de la cadena de middleware, llama al manejador de errores. Debe manejar el código de respuesta 401 en ese controlador de errores. Vea esto para obtener más información sobre el manejo de errores en Express

EDITAR: Como comentó @Baptiste Costa , simplemente llamar a next() no detendrá la ejecución actual, sino que llamará al siguiente middleware. Es una buena práctica usar return next() lugar para evitar que Node arroje más errores (como los can't set headers after they are sent – error). Esto incluye la sugerencia anterior de lanzar errores, que es común:

 return next(new Error([error])); 

[Mis disculpas por no publicar esto en un comentario, todavía no tengo suficiente reputación]

Por supuesto, Express no puede hacer mágicamente que su función javascript deje de ejecutarse desde otro lugar.

No me gusta la siguiente ([error]) solución porque creo que los errores solo deben usarse en circunstancias que normalmente no se esperan (como una base de datos inalcanzable o algo así). En este caso, una contraseña equivocada simple causaría un error. Es una convención común no usar excepciones / errores para el flujo de control ordinario.

Por lo tanto, recomiendo colocar una statement de retorno después de la llamada de envío de remisión para que su función deje de ejecutarse.

 client.login( username, password, function( auth, client ) { if( !auth ) { res.send( 401 ); return; } // DO OTHER STUFF REALLY ONLY IF AUTH IS SUCCESSFUL } 

Solo necesitas hacer una devolución para finalizar el flujo:

 return res.send( 401 ); 

Eso enviará la respuesta 401 hacia atrás y no avanzará en el flujo.

¿Por qué nadie sugiere usar un bloque ‘else’?

 if(!auth){ // Auth fail code res.send 'Fail' } else { // Auth pass code res.send 'Pass' } 

‘next’ se usa cuando se crea su propio middleware para “app.use (function (req, res, next));”. Si ha configurado una ruta como “app.get (route, function (req, res))”; entonces el código en la función es donde puede tener el código que está especificando sin necesidad de usar ‘siguiente’.