express-如何添加通用的运行时异常处理程序?

时间:2019-01-21 10:27:01

标签: node.js express async-await

我正在将Express与async/await一起使用。当async函数被拒绝时,将引发异常。 但是,客户不会收到他的请求的答复,这使他悬而未决。

如何为未处理的运行时异常添加全局异常处理程序?在这种情况下,服务器应以状态代码"Server Error" 500答复。

  • 我不想用trycatch包住我所有的服务器端功能
  • 我不想暗示下一个请求处理程序出现错误(例如next(err);
  • 我读过https://expressjs.com/en/guide/error-handling.html,找不到我所描述的简单内容(我错过了什么吗?)

这是我的示例快递应用程序:

const express = require('express');
const app = express();
const port = 8080;

async function validate() {
    let shouldFail = Math.random() >= 0.5;
    if (shouldFail) {
        throw new Error();
    }
}

app.get('/', async (req, res) => {
    await validate();
    res.json({"foo": "bar"});
});

app.listen(port, () => console.log(`listening on port ${port}!`));
  

注意-http函数将随机失败。只是出于演示目的。

2 个答案:

答案 0 :(得分:1)

开箱即用的express不支持此功能。 但是,可以通过简约的包装函数来实现。

在常见的地方定义以下功能,

function unhandledExceptionsHandler(asyncFunction) {
    return async (req, res, next) => {
        try {
            await asyncFunction(req, res, next);
        }
        catch (e) {
            // TODO Log error internally
            res.status(500).send("Server Error");
        }
    }
}

包装您的回调函数,

app.get('/', unhandledExceptionsHandler(async (req, res) => {
    await validate();
    res.json({"foo": "bar"});
}));

答案 1 :(得分:0)

express内置了错误处理机制。您可以通过添加拦截器来配置通用错误处理程序。

const express = require('express');
const app = express();
const port = 8080;

async function validate() {
    let shouldFail = Math.random() >= 0.5;
    if (shouldFail) {
        throw new Error();
    }
}

app.get('/', async (req, res) => {
    await validate();
    res.json({"foo": "bar"});
});

// This interceptor will be called with err object if any of the above code breaks
// This should always be a last interceptor
app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})

app.listen(port, () => console.log(`listening on port ${port}!`));

您可以详细了解express错误处理here