찾다
웹 프론트엔드JS 튜토리얼Node에서 Express의 오류 처리 미들웨어에 대한 간략한 분석

이 기사에서는 Node에서 Express의 오류 처리 미들웨어를 살펴보고 오류 처리 미들웨어를 정의하고 이를 async/await와 함께 사용하는 방법을 소개합니다. 모두에게 도움이 되기를 바랍니다.

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()를 호출해야 합니다. 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')
})

最后

Express 错误处理中间件允许您以最大化关注点分离的方式处理错误。您不需要处理业务逻辑中的错误,如果使用 async/await,甚至不需要 try/catchrrreee

Express 미들웨어는 순차적으로 실행된다는 점 기억해주세요. 다른 모든 미들웨어 이후에 오류 처리기를 마지막에 정의해야 합니다. 그렇지 않으면 오류 핸들러가 호출되지 않습니다.

async/await와 함께 사용 Express는 promise 코드>를 포착할 수 없습니다. 예외적으로 Express는 ES6 이전에 작성되었으며 async/await를 처리하는 방법에 대한 좋은 솔루션이 없습니다. 🎜예를 들어 다음 서버는 Promise reject가 처리되지 않기 때문에 HTTP 응답을 성공적으로 보내지 않습니다. 🎜rrreee🎜캡처를 수행하기 위해 기존 라이브러리를 래핑하거나 사용할 수 있습니다. 🎜🎜먼저 async/await를 Express 오류 처리 미들웨어와 연결하는 함수를 캡슐화합니다. 🎜
🎜🎜참고🎜: 비동기 함수는 Promise를 반환하므로 모든 오류를 catch()하고 next()에 전달해야 합니다. 🎜
rrreee🎜타사 라이브러리 사용 express-async-errors🎜, 간단한 ES6 비동기/대기 지원 해킹: 🎜rrreee

마지막으로 🎜🎜Express 오류 처리 미들웨어 허용 문제의 분리를 극대화하는 방식으로 오류를 처리합니다. 비즈니스 로직의 오류를 처리할 필요가 없으며 async/await를 사용하는 경우 try/catch도 필요하지 않습니다. 이러한 오류는 오류 핸들러에 표시되며, 오류 핸들러는 요청에 응답하는 방법을 결정할 수 있습니다. 다음 Express 앱에서 이 강력한 기능을 활용해 보세요! 🎜🎜노드 관련 지식을 더 보려면 🎜nodejs 튜토리얼🎜을 방문하세요! 🎜

위 내용은 Node에서 Express의 오류 처리 미들웨어에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 掘金社区에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
Vercel是什么?怎么部署Node服务?Vercel是什么?怎么部署Node服务?May 07, 2022 pm 09:34 PM

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

node.js gm是什么node.js gm是什么Jul 12, 2022 pm 06:28 PM

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

一文解析package.json和package-lock.json一文解析package.json和package-lock.jsonSep 01, 2022 pm 08:02 PM

本篇文章带大家详解package.json和package-lock.json文件,希望对大家有所帮助!

怎么使用pkg将Node.js项目打包为可执行文件?怎么使用pkg将Node.js项目打包为可执行文件?Jul 26, 2022 pm 07:33 PM

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node.js项目打包为可执行文件的方法,希望对大家有所帮助!

分享一个Nodejs web框架:Fastify分享一个Nodejs web框架:FastifyAug 04, 2022 pm 09:23 PM

本篇文章给大家分享一个Nodejs web框架:Fastify,简单介绍一下Fastify支持的特性、Fastify支持的插件以及Fastify的使用方法,希望对大家有所帮助!

node爬取数据实例:聊聊怎么抓取小说章节node爬取数据实例:聊聊怎么抓取小说章节May 02, 2022 am 10:00 AM

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

手把手带你使用Node.js和adb开发一个手机备份小工具手把手带你使用Node.js和adb开发一个手机备份小工具Apr 14, 2022 pm 09:06 PM

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

图文详解node.js如何构建web服务器图文详解node.js如何构建web服务器Aug 08, 2022 am 10:27 AM

先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구