千家信息网

Node中Express的错误处理中间件怎么定义

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"Node中Express的错误处理中间件怎么定义",在日常操作中,相信很多人在Node中Express的错误处理中间件怎么定义问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作
千家信息网最后更新 2026年10月31日Node中Express的错误处理中间件怎么定义

这篇文章主要介绍"Node中Express的错误处理中间件怎么定义",在日常操作中,相信很多人在Node中Express的错误处理中间件怎么定义问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Node中Express的错误处理中间件怎么定义"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Express 的错误处理中间件可帮助您处理错误,而无需重复同样的工作。假设您直接在 Express 路由处理程序中处理错误:

app.put('/user/:id', async (req, res) => {  let user  try {    user = await User.findOneAndUpdate({ _id: req.params.id }, req.body)  } catch (err) {    return res.status(err.status || 500).json({ message: err.message })  }  return res.json({ user })})

上面的代码可以正常工作,但是,如果有数百个接口呢,那么错误处理逻辑将变得不可维护,因为它被重复了数百次。

定义错误处理中间件

Express 根据中间件函数采用的参数数量分为不同的类型。接受 4 个参数的中间件函数被定义为错误处理中间件,只有在发生错误时才会被调用。

const app = require('express')()app.get('*', function routeHandler() {  // 此中间件抛出一个错误,Express 将直接转到下一个错误处理程序  throw new Error('Oops!')})app.get('*', (req, res, next) => {  // 此中间件不是错误处理程序(只有3个参数),Express 将跳过它,因为之前的中间件中存在错误  console.log('这里不会打印')})// 您的函数必须接受 4 个参数,以便 Express 将其视为错误处理中间件。app.use((err, req, res, next) => {  res.status(500).json({ message: err.message })})

Express 会自动为您处理同步错误,如上面的 routeHandler() 方法。但是 Express 不处理异步错误。如果出现异步错误,则需要调用 next()。

const app = require('express')()app.get('*', (req, res, next) => {  // next() 方法告诉 Express 转到链中的下一个中间件。  // Express 不处理异步错误,因此您需要通过调用 next() 来报告错误。  setImmediate(() => {    next(new Error('Oops'))  })})app.use((err, req, res, next) => {  res.status(500).json({    message: err.message  })})

请记住,Express 中间件是按顺序执行的。您应该在所有其他中间件之后,最后定义错误处理程序。否则,您的错误处理程序将不会被调用:

与 async/await 一起使用

Express 无法捕获 promise 的异常,Express 在 ES6 之前编写,对于如何处理 async/await 它扔没有好的解决方案。

例如,下面的服务器永远不会成功发送 HTTP 响应,因为 Promise reject 永远不会得到处理:

const app = require('express')()app.get('*', (req, res, next) => {  // 报告异步错误必须通过 next()  return new Promise((resolve, reject) => {    setImmediate(() => reject(new Error('woops')))  }).catch(next)})app.use((error, req, res, next) => {  console.log('will not print')  res.json({ message: error.message })})app.listen(3000)

我们可以封装或者使用现有的库来进行捕获。

首先,我们先简单封装一个函数,将 async/await 与 Express 错误处理中间件联系起来。

注意:异步函数会返回 Promise,因此您需要确保 catch() 所有错误并将其传递给 next()。

function wrapAsync(fn) {  return function(req, res, next) {    fn(req, res, next).catch(next)  }}app.get('*', wrapAsync(async (req, res) => {  await new Promise(resolve => setTimeout(() => resolve(), 50))  // Async error!  throw new Error('woops')}))

使用第三方库 express-async-errors,一个简单的 ES6 async/await 支持 hack:

require('express-async-errors')app.get('*', async (req, res, next) => {  await new Promise((resolve) => setTimeout(() => resolve(), 50))  throw new Error('woops')})

到此,关于"Node中Express的错误处理中间件怎么定义"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

错误 处理 中间件 函数 程序 参数 学习 方法 面的 帮助 只有 报告 更多 封装 工作 不同 实用 有数 成功 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司简介 广州大一互联网络科技有限公司 中关村互联网 科技集团 互联网科技公司华为 科技股互联网 狮子座互联网科技 卓越科技(互联网 ) 广州互联网络科技有限公司 丰台科技园 互联网公司 互联网实体化科技化 互联网大会黑科技排名 互联网软件和科技 武汉健翔互联网络科技有限公司 晓花互联网科技有限公司网址 银川新华互联网科技学校联系电话 互联网科技大赛获奖感言 2021互联网科技公司排名 银行科技岗属于互联网吗 深圳互联网科技园地址 广州全民伙伴互联网科技有限公司 中国互联网科技工作委员会毛军 互联网科技与金融科技 鑫亿盛互联网科技 善班互联网科技有限公司 易通互联网络科技有限公司 互联网科技大会案例 江苏南京365互联网科技 西藏七维空间互联网科技有限公司 科技互联网的核心竞争力 科技互联网专业务虚会材料
0