Soy nuevo en express + node.js, así que escribí una API de descanso usando mongoose. ¿Cuál es la mejor manera de manejar errores de tiempo de ejecución como errores de base de datos, etc.?
He leído en la documentación expresa que puede tener una function(err, res, req, next) para manejar estos errores, y puede llamar a esta función solo llamando a next(err) . Está bien, así que imagina que tienes un modelo Moongose User y en un controlador escribes esta función:
const find = (email, password) => { User.find({ email: email }, (err, doc) => { if (err) { // handle error } return doc; }); };Luego, tienes en otro archivo un controlador para una ruta:
router.get('/users', (req, res) => { userController.find(req.body.email); }); Entonces, en este punto, puede manejar el error mongo escribiendo throw(err) en el modelo y usando try/catch en el controlador para luego llamar a next(err) , ¿verdad? Pero he leído que usar try/catch en JavaScript no es una buena práctica porque crea un nuevo contexto de ejecución, etc.
¿Cuál es la mejor manera de manejar estos errores en Express?
Te sugiero que uses promesas. No solo hace que su código sea más limpio, sino que también el manejo de errores es mucho más fácil. Como referencia, puede visitar this o this .
Si está utilizando mongoose, puede agregar su propia biblioteca de promesa.
const mongoose = require('mongoose'); mongoose.connect(uri); // plug in the promise library: mongoose.Promise = global.Promise; mongoose.connection.on('error', (err) => { console.error(`Mongoose connection error: ${err}`) process.exit(1) })Y úsalo como a continuación:
En el controlador:
const find = (email) => { var userQuery = User.find({ email: email }); return userQuery.exec(); };En enrutador:
router.get('/users', (req, res) => { userController.find(req.body.email).then(function(docs){ // Send your response }).then(null, function(err){ //Handle Error }); });