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