Tengo un desafío en el que realmente no puedo tomar una decisión sobre cómo lidiar con las respuestas HTTP/Errores en mis servicios y controladores en mi Express API. Mi objetivo es que los servicios sean responsables de una sola cosa y no se ocupen de HTTP en absoluto. Al menos ese es mi pensamiento.
Me encantaría recibir comentarios sobre mi enfoque...
He agregado middlewares de error general:
const errorResponder = (error, req, res, next) => { if (error.statusCode && error.message) { return res.status(error.statusCode).send(error.message); } if (error.statusCode) { return res.status(error.statusCode).send(); } if (error.message) { return res.status(500).send(error.message); } return next(error); // Forward if above is't triggered }; const errorFailSafe = (error, req, res, next) => { console.log("Fail safe"); res.status(500).send("Something went wrong, we are digging into it!"); };Y luego, en mi controlador, desenvuelvo lo que necesito de la solicitud y lo envío a un servicio. Luego envío la respuesta al cliente.
findUser: async (req,res,next) => { const userId = req.params.userId; try { // Call service const user = await UserService.findOne(userId); // Send user back to client res.status(200).send(user); } catch (error) { return next(error) } }En mi servicio usando Sequelize:
findOne: async (userId) => { try { let user = await db.users.findByPk(userId); if (user == null) { throw new NotFound("User not found"); } return user; } catch (error) { throw error; } };El error NotFound es una clase de error personalizada que extiende Error.
class NotFound extends Error { constructor(message) { super(message); this.statusCode = 404; } } module.exports = NotFound ;Aquí rompo un poco la separación haciendo que el Servicio se ocupe de HTTP llamando a NotFound. Podría cambiar esto para que sea el controlador el que haga la verificación. ¿Sería eso mejor?
Cualquier comentario sería apreciado. :)