Node에서 Express의 오류 처리 미들웨어에 대한 간략한 분석
이 기사에서는 Node에서 Express의 오류 처리 미들웨어를 살펴보고 오류 처리 미들웨어를 정의하고 이를 async/await와 함께 사용하는 방법을 소개합니다. 모두에게 도움이 되기를 바랍니다.
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/catch
rrreee
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 튜토리얼🎜을 방문하세요! 🎜
catch()
하고 next()
에 전달해야 합니다. 🎜async/await
를 사용하는 경우 try/catch
도 필요하지 않습니다. 이러한 오류는 오류 핸들러에 표시되며, 오류 핸들러는 요청에 응답하는 방법을 결정할 수 있습니다. 다음 Express 앱에서 이 강력한 기능을 활용해 보세요! 🎜🎜노드 관련 지식을 더 보려면 🎜nodejs 튜토리얼🎜을 방문하세요! 🎜위 내용은 Node에서 Express의 오류 처리 미들웨어에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이 기사는 NodeJS V8 엔진의 메모리 및 가비지 수집기(GC)에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다.

Non-Blocking, Event-Driven 기반으로 구축된 Node 서비스는 메모리 소모가 적다는 장점이 있으며, 대규모 네트워크 요청을 처리하는데 매우 적합합니다. 대규모 요청을 전제로 '메모리 제어'와 관련된 문제를 고려해야 합니다. 1. V8의 가비지 수집 메커니즘과 메모리 제한 Js는 가비지 수집 기계에 의해 제어됩니다.

파일 업로드를 처리하는 방법은 무엇입니까? 다음 글에서는 Express를 사용하여 노드 프로젝트에서 파일 업로드를 처리하는 방법을 소개하겠습니다. 도움이 되길 바랍니다.

Node용 Docker 이미지를 선택하는 것은 사소한 문제처럼 보일 수 있지만 이미지의 크기와 잠재적인 취약점은 CI/CD 프로세스와 보안에 상당한 영향을 미칠 수 있습니다. 그렇다면 최고의 Node.js Docker 이미지를 어떻게 선택합니까?

파일 모듈은 파일 읽기/쓰기/열기/닫기/삭제 추가 등과 같은 기본 파일 작업을 캡슐화한 것입니다. 파일 모듈의 가장 큰 특징은 모든 메소드가 **동기** 및 ** 두 가지 버전을 제공한다는 것입니다. 비동기**, sync 접미사가 있는 메서드는 모두 동기화 메서드이고, 없는 메서드는 모두 이기종 메서드입니다.

Node.js는 GC(가비지 수집)를 어떻게 수행하나요? 다음 기사에서는 이에 대해 설명합니다.

이벤트 루프는 Node.js의 기본 부분이며 메인 스레드가 차단되지 않도록 하여 비동기 프로그래밍을 가능하게 합니다. 이벤트 루프를 이해하는 것은 효율적인 애플리케이션을 구축하는 데 중요합니다. 다음 기사는 Node.js의 이벤트 루프에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다!

nodejs 실행 파일을 pkg로 패키징하는 방법은 무엇입니까? 다음 기사에서는 pkg를 사용하여 Node 프로젝트를 실행 파일로 패키징하는 방법을 소개합니다. 도움이 되기를 바랍니다.
