Esto puede ser extremadamente estúpido, pero no he encontrado mucho al respecto porque no entiendo cómo debo buscar esto.
Tengo un controlador de ruta que puede llamar a diferentes funciones según algunos parámetros de solicitud, y me gustaría saber cuál es la mejor manera de tratar los errores dentro de las funciones para pasar errores al middleware de manejo de errores. Considere algo como esto:
router.get('/error/:error_id', (req, res, next) => { my_function(); } function my_function(){ // do something async, like readfile var f = fs.readFile("blablabla", function (err, data) { // would want to deal with the error }); } Si ocurre un error durante fs.readFile , ¿cómo paso el error a next para reenviarlo al middleware de error? La única solución es pasar el siguiente parámetro a la función function my_function(next){...} ?
En caso de que la función no llamara a ninguna operación de E/S asíncrona, un simple try/catch en el controlador de ruta estaría bien (supongo), así:
router.get('/error/:error_id', (req, res, next) => { try{ my_function(); } catch(e){ next(e); }; } function my_function(){ // do stuff var f = fs.readFileSync("blablabla"); // possibly throws an error }Espero tener algo de sentido.
Tiene toda la razón en que debe pasar la next devolución de llamada a my_function ya que fs.readFile es asíncrono.
router.get('/error/:error_id', (req, res, next) => { my_function(next); } function my_function(next) { fs.readFile("blablabla", function (err, data) { if (err) { next(err); } else { // Process the data // Don't forget to call `next` to send respond the client } }); }Por cierto, no puedes hacer
var f = fs.readFile(...) porque fs.readFile es asíncrono. Los datos deben manejarse dentro de la devolución de llamada.