この記事では、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()
を呼び出す必要があります。
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
を処理する方法について適切な解決策がありませんでした。
たとえば、次のサーバーは、Promise reject
が処理されないため、HTTP 応答を正常に送信できません:
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 非同期/待機サポート ハック:
require('express-async-errors') app.get('*', async (req, res, next) => { await new Promise((resolve) => setTimeout(() => resolve(), 50)) throw new Error('woops') })
async/await を使用する場合は
try/catch も処理する必要はありません。これらのエラーはエラー ハンドラーに表示され、リクエストへの応答方法を決定できます。次の Express アプリでこの強力な機能をぜひ活用してください。
nodejs チュートリアル を参照してください。
以上がNode の Express のエラー処理ミドルウェアの簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。