Creé una excepción personalizada simple basada en este enlace de la siguiente manera:
function userErr(message) { logger.info("reach user error function") const error = new Error(message); error.type = "userErr"; return error; } function failureErr(message) { logger.info("reach failure error function") const error = new Error(message); error.type = "failureErr"; return error; }El comportamiento esperado es Express arrojará este error al middleware del controlador de errores personalizado al final del archivo server.js:
app.use((error, req, res, next) => { console.log("Error Handling Middleware: " + error.message); if (error.type === "userErr") { res.status(400).json({ status: "error", statusCode: "400", message: error.message }); } else if (error.type === "failureErr") { res.status(500).json({ status: "fail", statusCode: "500", message: error.message }); } else { res.status(500).json({ status: "error", statusCode: "500", message: error.message }); } }); app.listen(8080, () => { console.log("listening on 8080..."); }); //the server object listens on port 8080Cuando coloco estas funciones sobre las rutas (app.get, app.post, etc...) en el archivo server.js (esto debería ser index.js para la mayoría de las personas), funciona bien. Pero cuando empiezo a eliminar estas rutas y las coloco en un archivo de ruta en la carpeta de rutas, el tráfico llega a la ruta correctamente, pero cada vez que ocurre un error y ejecuta la función anterior, JavaScript arroja un error en la segunda línea, cual es:
const error = new Error(message);por ejemplo:
const error = new Error(message); ^ Error: [object Object] at new failureErr (file:///.../src/server.js:89:17) at file:///.../src/routes/testRoutes.js:104:21 { type: 'failureErr'¡Qué raro! He intentado colocar estas funciones en un archivo separado e importarlas al archivo de ruta, pero aún muestra el mismo error.
Imité la carpeta en la caja de códigos (no pude hacer que se ejecutara) para que pueda comprender el contexto. El index.js por sí solo es el que funciona, mientras que el index2.js con la carpeta de enrutadores es el que falló.
Agradezco cualquier comentario sobre las preguntas o cualquier idea sobre dónde hice algo mal.
El código que muestra en su sandbox está haciendo esto throw new userError("It's an user error"); , pero userError() no está configurado correctamente como constructor y, por lo tanto, no se puede llamar con new . Este es el código en su sandbox:
app.get("/api/v1/test", (req, res, next) => { try { const userErr = req.headers.userErr; console.log(userErr); if (userErr === "true") { throw new userError("It's an user error"); } else { throw new failureError("It's an failure error"); } } catch (e) { next(e); } }); El código que muestra no ha convertido ni userError() ni failureError() en clases o constructores. Son meras funciones. Por lo tanto, no se pueden llamar con new .
Si desea convertirlos en clases, haga algo como esto:
class userError extends Error { constructor(message) { super(message); console.log("reach user error function"); this.type = "userErr"; } }Tenga en cuenta que esta es la forma más moderna de hacer esto que la que se muestra en el artículo al que hace referencia (que aparentemente es antiguo).
O simplemente puede usar lo que tiene como funciones:
app.get("/api/v1/test", (req, res, next) => { try { const userErr = req.headers.userErr; console.log(userErr); if (userErr === "true") { next(userError("It's an user error")); return; } else { next(failureError("It's an failure error")); return; } res.send("ok"); } catch (e) { next(e); } });