Lo que quiero lograr es cuando un controlador expreso falla al lanzar una excepción no controlada o devolver una respuesta vacía como undefined o [] , quiero que el controlador devuelva una respuesta simulada predefinida en lugar de fallar. Esto significa que mi servidor nunca falla, ya que devuelve los datos reales normales o los datos simulados predefinidos. Por supuesto, solo activaré esto en el entorno de desarrollo y nunca en producción.
Creo que un middleware es ideal porque no quiero contaminar la lógica de todos los controladores al inyectar la verificación de respuesta.
¿Es esto posible con un middleware en express? Si no, ¿cuál es una forma más limpia de lograr esto?
El valor de retorno de un controlador de middleware es irrelevante, porque un controlador de middleware es asíncrono por naturaleza. Hace una de tres cosas:
res.end(...) o similar.next(err) .next() .Los errores se pueden capturar con un middleware de manejo de errores adicional, y las excepciones se pueden convertir en errores como se explica en [ExpressJs]: El controlador de errores personalizado no detecta excepciones .
Sin embargo, no puede cambiar una respuesta después de que se haya enviado. Además, escribes
un controlador express falla... al... devolver una respuesta vacía
pero una respuesta vacía no es un fracaso. Si desea tratar las respuestas vacías como fallas, pero solo en producción, le sugiero que las maneje como errores especiales. En lugar de responder con res.json([]) , por ejemplo, escribe next({emptyResponse: []}) y tiene un middleware especial de manejo de errores en desarrollo solo para manejar estos:
app.use(function(err, req, res, next) { if (err.emptyResponse) { console.error(err.emptyResponse); res.end("Mock response"); } else next(err); // delegate to the standard error handler });Tal vez hay una idea errónea de lo que es una respuesta. El servidor transmite la respuesta al cliente, solo el cliente puede "obtener" la respuesta en este sentido. Las respuestas no se pueden pasar entre middlewares.