广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >Node中Express的错误处理中间件怎么定义
  • 719
分享到

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

2024-04-02 19:04:59 719人浏览 独家记忆
摘要

这篇文章主要介绍“node中Express的错误处理中间件怎么定义”,在日常操作中,相信很多人在Node中Express的错误处理中间件怎么定义问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,

这篇文章主要介绍“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的错误处理中间件怎么定义”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Node中Express的错误处理中间件怎么定义

本文链接: https://www.lsjlt.com/news/97238.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Node中Express的错误处理中间件怎么定义
    这篇文章主要介绍“Node中Express的错误处理中间件怎么定义”,在日常操作中,相信很多人在Node中Express的错误处理中间件怎么定义问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2022-10-19
  • node.js express和koa中间件机制和错误处理机制
    目录一、前言二、中间件问题解析三、错误逻辑捕获3.1 express的错误捕获逻辑3.2 同步逻辑错误获取的底层逻辑3.3 异步逻辑错误获取的底层逻辑3.4 koa的错误获取逻辑一、...
    99+
    2022-11-13
  • express学习笔记5 - 自定义路由异常处理中间件
    修改router/index.js,添加异常处理中间件 ** * 自定义路由异常处理中间件 * 注意两点: * 第一,方法的参数不能减少 * 第二,方法的必须放在路由最后 */router.use((err, req, res, next)...
    99+
    2023-09-16
    express 学习 笔记
  • node项目中怎么使用express来处理文件的上传
    这篇文章主要介绍“node项目中怎么使用express来处理文件的上传”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“node项目中怎么使用express来处理文件的上传”文章能帮助大家解决问题。上传...
    99+
    2023-07-05
  • nodejs中怎么利用node-images中间件处理图片
    这期内容当中小编将会给大家带来有关nodejs中怎么利用node-images中间件处理图片,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。node.js轻量级跨平台图像编...
    99+
    2022-10-19
  • 怎么在React中处理错误边界组件
    这期内容当中小编将会给大家带来有关怎么在React中处理错误边界组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。React中的未捕获的 JS 错误会导致整个应用的崩溃,和整个组件树的卸载。从 React...
    99+
    2023-06-14
  • spring boot中的404错误信息怎么进行自定义
    spring boot中的404错误信息怎么进行自定义?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。返回json@Bean public EmbeddedSer...
    99+
    2023-05-31
    springboot spring boo 400错误
  • thinkphp5中怎么进行错误处理的相关信息
    本篇内容介绍了“thinkphp5中怎么进行错误处理的相关信息”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!错误处理机制ThinkPHP5提...
    99+
    2023-07-05
  • Vue怎么在自定义指令绑定的处理函数中传递参数
    这篇文章主要介绍“Vue怎么在自定义指令绑定的处理函数中传递参数”,在日常操作中,相信很多人在Vue怎么在自定义指令绑定的处理函数中传递参数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue怎么在自定义指令...
    99+
    2023-07-05
  • Java异常处理中怎么写出“正确”但被编译器认为有语法错误的程序
    Java异常处理中怎么写出“正确”但被编译器认为有语法错误的程序,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。文章的标题看似自相矛盾,然而我在“正确”二字上打了...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作