Search code examples
node.jsexpresstry-catch

Node: Globally catching exception doesn't work


I have tried to make a globally catching exception following some documentation and I have done this:

First, I have created a middleweare in index.js file:

import morgan from "morgan";
import config from "./config";
import express from "express";
import helmet from "helmet";
import {Router} from "./routes/routes";
import * as Sentry from "@sentry/node";
import * as Tracing from "@sentry/tracing";
import errorHandler from "./middlewares/errorHandler";

console.log("Entorno: " + config.node_env);
console.log("Puerto:  " + config.flycon.port);

const app = express();

//Settings
app.set("port", config.flycon.port || 3000);
app.set("serverName", config.flycon.server_name);


//Middlewares
app.use(morgan("dev"));
app.use(helmet());  //Due to security reasons
app.use(express.urlencoded({extended: false})); //To understand forms
app.use(express.json()); //To understand json. We are going to send and receive json
app.use(errorHandler);

//Routes
app.use(Router);

//Start server
app.listen(app.get("port"), () => {
    console.log("Server " + app.get("serverName") + " listening on port " + app.get("port"));
});

Second, I haved defined the errorHanlder in a middleware file called errorHandler.js:

const errorHandler = (error, req, res, next) => {
// Logging the error here
console.log(error); 
// Returning the status and error message to client
res.status(400).send(error.message); 

next();
}
module.exports = errorHandler;

And third, I have tried to throw an exception to test the development and I throw this exception in routes.js file.

import express from "express";
import { validationResult } from "express-validator";
import errorHandler from "../middlewares/errorHandler"; 
import config from "../config";

const router = express.Router();
const app = express();

router.get("/flycon", async(req, res, next) => {

    res.status(200).json({"result": "OK"});
});

/**
 * Endpoint to test the access to the backend server
 */
router.get("/flycon/healthy", (req, res, next) => {
    try{
        throw new Error("Not implemented");
        //res.status(200).json({ "resultado": "OK" });
    }catch(error){
        console.log("Dentrod el catch");
        return next(error);
    }

});

module.exports.Router = router;

And when I access to the endpoint /flycon/healthy to get the message through the error handler I've got an HTML error instead of getting an error from the errorHandler function.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Error</title>
  </head>
  <body>
    <pre>Error: Not implemented<br> &nbsp; &nbsp;at /home/josecarlos/Workspace/BlueCode/Youmalou/flycon/routes/routes.js:23:15<br> &nbsp; &nbsp;at Layer.handle [as handle_request] (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/layer.js:95:5)<br> &nbsp; &nbsp;at next (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/route.js:144:13)<br> &nbsp; &nbsp;at Route.dispatch (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/route.js:114:3)<br> &nbsp; &nbsp;at Layer.handle [as handle_request] (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/layer.js:95:5)<br> &nbsp; &nbsp;at /home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:284:15<br> &nbsp; &nbsp;at Function.process_params (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:346:12)<br> &nbsp; &nbsp;at next (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:280:10)<br> &nbsp; &nbsp;at Function.handle (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:175:3)<br> &nbsp; &nbsp;at router (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:47:12)<br> &nbsp; &nbsp;at Layer.handle [as handle_request] (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/layer.js:95:5)<br> &nbsp; &nbsp;at trim_prefix (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:328:13)<br> &nbsp; &nbsp;at /home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:286:9<br> &nbsp; &nbsp;at Function.process_params (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:346:12)<br> &nbsp; &nbsp;at next (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:280:10)<br> &nbsp; &nbsp;at Layer.handle [as handle_request] (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/layer.js:91:12)<br> &nbsp; &nbsp;at trim_prefix (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:328:13)<br> &nbsp; &nbsp;at /home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:286:9<br> &nbsp; &nbsp;at Function.process_params (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:346:12)<br> &nbsp; &nbsp;at next (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:280:10)<br> &nbsp; &nbsp;at jsonParser (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/body-parser/lib/types/json.js:110:7)<br> &nbsp; &nbsp;at Layer.handle [as handle_request] (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/layer.js:95:5)<br> &nbsp; &nbsp;at trim_prefix (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:328:13)<br> &nbsp; &nbsp;at /home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:286:9<br> &nbsp; &nbsp;at Function.process_params (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:346:12)<br> &nbsp; &nbsp;at next (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:280:10)<br> &nbsp; &nbsp;at urlencodedParser (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/body-parser/lib/types/urlencoded.js:91:7)<br> &nbsp; &nbsp;at Layer.handle [as handle_request] (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/layer.js:95:5)<br> &nbsp; &nbsp;at trim_prefix (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:328:13)<br> &nbsp; &nbsp;at /home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:286:9<br> &nbsp; &nbsp;at Function.process_params (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:346:12)<br> &nbsp; &nbsp;at next (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:280:10)<br> &nbsp; &nbsp;at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:445:6)<br> &nbsp; &nbsp;at xXssProtectionMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:327:3)<br> &nbsp; &nbsp;at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> &nbsp; &nbsp;at referrerPolicyMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:220:3)<br> &nbsp; &nbsp;at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> &nbsp; &nbsp;at xPermittedCrossDomainPoliciesMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:313:3)<br> &nbsp; &nbsp;at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> &nbsp; &nbsp;at originAgentClusterMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:195:3)<br> &nbsp; &nbsp;at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> &nbsp; &nbsp;at xContentTypeOptionsMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:262:3)<br> &nbsp; &nbsp;at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> &nbsp; &nbsp;at xDownloadOptionsMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:277:3)<br> &nbsp; &nbsp;at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> &nbsp; &nbsp;at strictTransportSecurityMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:255:3)<br> &nbsp; &nbsp;at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> &nbsp; &nbsp;at xPoweredByMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:320:3)<br> &nbsp; &nbsp;at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> &nbsp; &nbsp;at xFrameOptionsMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:297:3)</pre>
  </body>
</html>

What am I doing wrong?


Solution

  • You register app.use(errorHandler) before app.use(Router), but an error handler must be registered after the middleware that throws the error via next(err).