代码之家  ›  专栏  ›  技术社区  ›  Jossef Harush Kadouri

如何添加通用运行时异常处理程序?[复制品]

  •  0
  • Jossef Harush Kadouri  · 技术社区  · 6 年前

    我用快递 async/await . 当一个 async 函数被拒绝,引发异常。 但是,客户不会得到对他的请求的回应,让他悬在空中。

    我该怎么加一个 全局异常处理程序 对于未处理的运行时异常?在这些情况下,服务器应使用 "Server Error" 状态码 500 .

    这是我的示例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"});
    });
    
    app.listen(port, () => console.log(`listening on port ${port}!`));
    

    注意-HTTP函数将随机失败。只是为了演示。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Jossef Harush Kadouri    6 年前

    这在中不受支持 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"});
    }));
    
        2
  •  0
  •   Ganapati V S    6 年前

    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}!`));
    

    你可以阅读更多关于 表达 错误处理 here .

    推荐文章