【问题标题】:Express Try and Catch in Form of middleware以中间件的形式表达 Try and Catch
【发布时间】:2021-09-28 11:28:28
【问题描述】:

我正在使用 Express 开发 node.js 来构建后端。 我打算处理可能发生的状态 500 错误。

router.put('/test', async (req, res) => {
    try {
      return res.send(await request.updateTest(req.body, 1))
    } catch(err) {
        console.log(err)
        return res.status(500).send(err.stack)
    }
})

这是我的代码示例。它完美地工作。但是当我尝试从数据库查询中产生未知错误时,我想记录错误并返回状态 500 作为带有错误详细信息的响应。

但是每次我构建一个新的控制器/路由时,我都需要添加 try and catch

有没有我可以用中间件的形式来表达它们,而不是每次都写 try and catch?

这是我尝试将其用作中间件的代码示例,但它没有工作,调用时也没有效果。

error.js

module.exports = function (err, req, res, next) {
    console.log(err)
    res.status(500).send({
        error: 'Internal Server Error',
        message: err.stack
    })
    next(err)
}

main.js

const errorHandler = require('./error')
const { corsOption } = require('./cors')
const cors = require('cors')
const test = require('./test')


module.exports = function (app) {
    app.use(cors(corsOption))
    app.use(errorHandler)
    app.use('/api/test', test)
}

我有什么办法让它工作吗?

【问题讨论】:

标签: javascript node.js express error-handling


【解决方案1】:

您的全局错误处理程序应放在所有其他中间件/路由之后:

app.use(middleware)
// all other middlewares

app.use('/api/test', test)
// all other routes

// error handler
app.use(function (err, req, res, next) {
  res.status(500).json({
    error: err.message,
  });
});

为避免向所有内容添加 try/catch,最好包装您的路由处理程序以捕获错误 (asyncWrapper):

app.use(middleware)
// all other middlewares


const asyncWrapper = (cb) => {
  return (req, res, next) => cb(req, res, next).catch(next);
};

const test = async (req, res) => {
  return res.send(await request.updateTest(req.body, 1))
}

// wrap your handler to catch errors (Async functions return a promise)
app.use('/api/test', asyncWrapper(test))
// all other routes

// error handler
app.use(function (err, req, res, next) {
  res.status(500).json({
    error: err.message,
  });
});

【讨论】:

  • 我尝试在此之前的所有中间件/路由之后创建处理程序,但它不起作用。我尝试了您的 asyncWrapper 方法,但您的示例返回了“捕获未定义”错误。
  • @KhairulHabib 我已经修改了示例以向您展示完整的测试路线。
【解决方案2】:

有两种方法可以解决 Node.js 中未处理的异常

  1. 使用你已经在使用的 try-catch 块

  2. 使用 Process 即使用 Process 来处理异常。进程是一个全局对象,它提供有关当前 Node.js 进程的信息。进程是一个监听函数,它总是监听事件。最有效和最高效的方法是使用 Process。如果您的代码流中发生任何未捕获或未处理的异常,则该异常将在代码中被捕获

    process.on('uncaughtException', function(err) {
    
     // Handle the error safely
     console.log(err)
    })
    

上面的代码将能够处理 Node.js 中发生的任何类型的未处理异常。看到这个Process Events

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2012-04-29
    • 2016-02-19
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多