【问题标题】:express - how to add a generic runtime exceptions handler? [duplicate]express - 如何添加通用运行时异常处理程序? [复制]
【发布时间】:2019-06-14 17:20:15
【问题描述】:

我正在使用 async/await 的 express。当 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 函数会随机失败。这仅用于演示目的。

【问题讨论】:

  • 使用npmjs.com/package/express-promise-router在这种情况下不需要将代码包装在try catch中,它将由express-promise-router处理
  • 只需安装软件包并包含以下代码const router = require("express-promise-router")(); 将用于代替普通快速路由器
  • 你为什么不想使用next?这是作者推荐的模式。
  • @NikKyriakides - 使用next() 使我的代码具有错误意识,我想要简单。知道生态系统的某些部分会处理这个问题
  • 听起来您正在为未来的重大问题做好准备。我无法在评论中详细说明为什么您尝试做的事情听起来不明智。

标签: node.js express async-await


【解决方案1】:

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 的更多信息。

【讨论】:

  • 如果你没有捕捉到错误并将其传递给带有next(err)的错误处理中间件,这将不起作用。
【解决方案2】:

开箱即用的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"});
}));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多