Node の Express のエラー処理ミドルウェアの簡単な分析

青灯夜游
リリース: 2022-04-07 20:49:30
転載
3175 人が閲覧しました

この記事では、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() を呼び出す必要があります。

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 ミドルウェアは順番に実行されることに注意してください。エラー ハンドラーは、他のすべてのミドルウェアの後に最後に定義する必要があります。そうしないと、エラー ハンドラーは呼び出されません:

Used with 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')
})
ログイン後にコピー
最後に

Express エラー処理ミドルウェアを使用すると、懸念事項を最大限に分離した方法でエラーを処理できます。ビジネス ロジックでエラーを処理する必要はなく、

async/await を使用する場合は try/catch も処理する必要はありません。これらのエラーはエラー ハンドラーに表示され、リクエストへの応答方法を決定できます。次の Express アプリでこの強力な機能をぜひ活用してください。

ノード関連の知識の詳細については、

nodejs チュートリアル を参照してください。

以上がNode の Express のエラー処理ミドルウェアの簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート