【问题标题】:How do I create a catchall async error handler in express?如何在 express 中创建一个包罗万象的异步错误处理程序?
【发布时间】:2021-03-21 14:14:07
【问题描述】:

我正在使用 express.js,并且正在尝试创建一个包罗万象的异步错误处理程序。 假设我有 3 条路线都可能引发错误,

const app = express()

app.get('/user', async function(req,res) {
   const res = await getUsers()
})

app.get('/questions', async function(req,res) {
   const res = await getQuestions()
})

app.get('/answers', async function(req,res) {
   const res = await getAnswers()
})

在这三个路由中,所有 getXX 函数都可能会抛出错误。
我只想为所有路由设置一个异步处理程序。像这样的

app.use(asyncHandler)

所以我不必尝试/捕获每个可能引发错误的地方。有什么解决办法吗?

提前致谢!

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    最好在 try/catch 块中编写 async/await。因为 await 仅在 catch 块处理的 await 函数抛出错误时才从 promise 获取解析输出。

    在 catch 块中调用 next(error) 去抛出所有后面的中间件,直到找不到错误处理 Minddler。

    const app = require("../../Reference/node-post-demo/app")
    
    app.get('/user', async function (req, res, next) {
      try {
        const res = await getUsers();
        return res.json(res);
      } catch (error) {
        next(error)
      }
    })
    
    app.get('/questions', async function (req, res, next) {
      try {
        const res = await getQuestions()
        return res.json(res);
      } catch (error) {
        next(error)
      }
    })
    
    app.get('/answers', async function (req, res, next) {
      try {
        const res = await getAnswers()
        return res.json(res);
      } catch (error) {
        next(error)
      }
    })
    
    app.use(async (error, req, res) => {
      //here, your error hendling code
    })
    

    【讨论】:

    • 我认为这不能回答我的问题。您提供的代码意味着我必须为每个异步控制器提供 try/catch 块,这是我试图避免的。我想将处理程序包装成一个并避免重复代码
    • 最好将 try/catch 用于 async/await。您只需要将错误传递到 next() 并从一个地方处理所有错误。
    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2018-11-09
    相关资源
    最近更新 更多