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> at /home/josecarlos/Workspace/BlueCode/Youmalou/flycon/routes/routes.js:23:15<br> at Layer.handle [as handle_request] (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/layer.js:95:5)<br> at next (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/route.js:144:13)<br> at Route.dispatch (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/route.js:114:3)<br> at Layer.handle [as handle_request] (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/layer.js:95:5)<br> at /home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:284:15<br> at Function.process_params (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:346:12)<br> at next (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:280:10)<br> at Function.handle (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:175:3)<br> at router (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:47:12)<br> at Layer.handle [as handle_request] (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/layer.js:95:5)<br> at trim_prefix (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:328:13)<br> at /home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:286:9<br> at Function.process_params (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:346:12)<br> at next (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:280:10)<br> at Layer.handle [as handle_request] (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/layer.js:91:12)<br> at trim_prefix (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:328:13)<br> at /home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:286:9<br> at Function.process_params (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:346:12)<br> at next (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:280:10)<br> at jsonParser (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/body-parser/lib/types/json.js:110:7)<br> at Layer.handle [as handle_request] (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/layer.js:95:5)<br> at trim_prefix (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:328:13)<br> at /home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:286:9<br> at Function.process_params (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:346:12)<br> at next (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:280:10)<br> at urlencodedParser (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/body-parser/lib/types/urlencoded.js:91:7)<br> at Layer.handle [as handle_request] (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/layer.js:95:5)<br> at trim_prefix (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:328:13)<br> at /home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:286:9<br> at Function.process_params (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:346:12)<br> at next (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/express/lib/router/index.js:280:10)<br> at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:445:6)<br> at xXssProtectionMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:327:3)<br> at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> at referrerPolicyMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:220:3)<br> at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> at xPermittedCrossDomainPoliciesMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:313:3)<br> at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> at originAgentClusterMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:195:3)<br> at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> at xContentTypeOptionsMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:262:3)<br> at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> at xDownloadOptionsMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:277:3)<br> at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> at strictTransportSecurityMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:255:3)<br> at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> at xPoweredByMiddleware (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:320:3)<br> at internalNext (/home/josecarlos/Workspace/BlueCode/Youmalou/flycon/node_modules/helmet/dist/cjs/index.js:443:6)<br> 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?
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)
.