VUE3.0 をすぐに始める方法: Learn
Express のエラー処理ミドルウェアを使用すると、同じ作業を繰り返さずにエラーを処理できます。 Express ルート ハンドラーでエラーを直接処理すると仮定します:
app.put('/user/:id', async (req, res) => { ユーザーにさせます 試す { user = await User.findOneAndUpdate({ _id: req.params.id }, req.body) } キャッチ (エラー) { return res.status(err.status || 500).json({ メッセージ: err.message }) } 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('This will not be print') }) // Express が関数をエラー処理ミドルウェアとして扱うには、関数が 4 つのパラメーターを受け入れる必要があります。 app.use((err, req, res, next) => { res.status(500).json({ メッセージ: err.message }) })
Express は、上記のrouteHandler()
メソッドなどの同期エラーを自動的に処理します。ただし、Express は非同期エラーを処理しません。非同期エラーが発生した場合は、 next()
を呼び出す必要があります。
const app = require('express')() app.get('*', (req, res, next) => { // next() メソッドは、Express にチェーン内の次のミドルウェアに移動するように指示します。 // Express は非同期エラーを処理しないため、next() を呼び出してエラーを報告する必要があります。 setImmediate(() => { next(新しいエラー('おっと')) }) }) app.use((err, req, res, next) => { res.status(500).json({ メッセージ: エラーメッセージ }) })
Express ミドルウェアは順番に実行されることに注意してください。エラー ハンドラーは、他のすべてのミドルウェアの後に最後に定義する必要があります。そうしないと、エラー ハンドラーは呼び出されません。
async/await で Express をasync/await
、 promise
からの例外をキャッチできません。Express は ES6 より前に書かれており、それがスローするasync/await
を処理する方法について適切な解決策がありません。
たとえば、次のサーバーは Promise reject
が処理されないため、HTTP 応答を正常に送信できません:
const app = require('express')() app.get('*', (req, res, next) => { // 非同期エラーの報告は next() を渡す必要があります return new Promise((解決、拒否) => { setImmediate(() =>拒否(新しいエラー('woops'))) }).catch(次) }) app.use((error, req, res, next) => { console.log('印刷されません') res.json({ メッセージ: エラー.メッセージ }) }) app.listen(3000)をカプセル化する
ことも、既存のライブラリを使用してキャプチャすることもできます。
まず、 async/await
を Express エラー処理ミドルウェアに接続する関数を単純にカプセル化します。
注: 非同期関数は Promise を返すため、エラーを必ず
catch()
てnext()
に渡す必要があります。
関数 WrapAsync(fn) { return function(req, res, next) { fn(req, res, next).catch(next) } } app.get('*', WrapAsync(async (req, res) => { 新しい Promise を待ちます (resolve => setTimeout(() =>solve(), 50)) // 非同期エラー! 新しいエラーをスローします('おっと') }))
サードパーティのライブラリexpress-async-errors
を使用します。これは、ES6 の非同期/待機サポートの簡単なハックです:
require('express-async-errors') app.get('*', async (req, res, next) => { 新しい Promise((resolve) => setTimeout(() =>solve(), 50)) を待ちます 新しいエラーをスローします('おっと')
Express
エラー処理ミドルウェアを使用すると、懸念事項を最大限に分離した方法でエラーを処理できます。ビジネス ロジックでエラーを処理する必要はなく、 async/await
使用している場合はtry/catch
さえ必要ありません。これらのエラーはエラー ハンドラーに表示され、リクエストへの応答方法を決定できます。次の Express アプリでこの強力な機能をぜひ活用してください。