Express js error handling

后端 未结 5 1602
无人及你
无人及你 2020-12-15 18:19

I\'m trying to get error handling running with express but instead of seeing a response of \"error!!!\" like I expect I see \"some exception\" on the console and then the pr

相关标签:
5条回答
  • 2020-12-15 18:43

    Create an error function:

    function throwError(status, code, message) {
      const error = new Error(message);
      error.name = '';
      error.status = status;
      error.code = code;
      throw error;
    }
    

    e.g.

    throwError(422, 'InvalidEmail', '`email` should be a valid email address')
    

    We assign name to '' so that when we toString the error it doesn't prepend it with "Error: "

    As mentioned if you're using express you can create a special error handling middleware by specifying 4 arguments:

    app.use((err, req, res, next) => {
      if (err) {
        res.status(err.status || 500).json({ code: err.code || 'Error', message: err.toString() });
      }
    });
    

    If you're not using express or otherwise prefer, add that code to your catch handler instead.

    Why?

    1. Modern apps handle JSON, throwing errors in JSON makes more sense and results in cleaner UI code.

    2. You should not only throw error messages because they are imprecise to parse. What if the UI is a multilingual app? In that case they can use the code to show a localized message.

    0 讨论(0)
  • 2020-12-15 18:44

    I had the same problem and couldn't figure out what was wrong. The thing is if you have the express errorHandler defined then your custom error handler is never being called. If you have the next code, simply remove it:

    if ('development' === app.get('env')) {
      app.use(express.errorHandler());
    }
    

    Worked for me:)

    0 讨论(0)
  • 2020-12-15 18:50

    An example app/guide on error handling is available at https://expressjs.com/en/guide/error-handling.html However should fix your code:

    // Require Dependencies
    var express = require('express');
    var app = express();
    
    // Middleware
    app.use(app.router); // you need this line so the .get etc. routes are run and if an error within, then the error is parsed to the next middleware (your error reporter)
    app.use(function(err, req, res, next) {
        if(!err) return next(); // you also need this line
        console.log("error!!!");
        res.send("error!!!");
    });
    
    // Routes
    app.get('/', function(request, response) {
        throw "some exception";
        response.send('Hello World!');
    });
    
    // Listen
    app.listen(5000, function() {
      console.log("Listening on 5000");
    });
    
    0 讨论(0)
  • 2020-12-15 19:02

    A few tips:

    1) Your code wasn't working because your error handler middleware was run before your route was reached, so the error handler never had a chance to have the error passed to it. This style is known as continuation passing. Put your error handler last in the middleware stack.

    2) You should shut down the server when you have an unhandled error. The best way to do that is to call server.close(), where server is the result of doing var server = http.createServer(app);

    Which means, you should do something like this:

    var server = http.createServer(app);
    
    app.use(function(err, req, res, next) {
      console.log("error!!!");
      res.send("error!!!");
      server.close();
    });
    

    You should probably also time out the server.close(), in case it can't complete (your app is in an undefined state, after all):

    var server = http.createServer(app);
    
    app.use(function(err, req, res, next) {
      console.log("error!!!");
      res.send("error!!!");
    
      server.close();
    
      setTimeout(function () {
        process.exit(1);
      }, 3*1000);
    });
    

    I made a library that does all this for you, and lets you define custom responses, including specialized error views, static files to serve, etc...:

    https://github.com/ericelliott/express-error-handler

    0 讨论(0)
  • 2020-12-15 19:04

    Installing express install connect-domain, then something like this:

    var express = require("express"),  
        connectDomain = require("connect-domain"),
        app = express(),
        errorHandler;
    

    // Our error handler

    app.use(connectDomain());  
        errorHandler = function (err, req, res, next) {  
            res.send(500, {
               "status": "error",
               "message": err.message
            });
        console.log(err);
    };
    

    Then when setting up your endpoints, tack errorHandler on the end in a use():

    app.get("/some/data", function (req, res) {  
        // ... do some stuff ...
        res.send(200, "Yay! Happy Success!");
    }).use(errorHandler);
    
    0 讨论(0)
提交回复
热议问题