ホームページ >ウェブフロントエンド >jsチュートリアル >Express.js での高度なエラー処理をマスターして堅牢な Node.js アプリケーションを実現する

Express.js での高度なエラー処理をマスターして堅牢な Node.js アプリケーションを実現する

Susan Sarandon
Susan Sarandonオリジナル
2024-12-07 19:04:20392ブラウズ

Mastering Advanced Error Handling in Express.js for Robust Node.js Applications

エラー処理は、堅牢な Express.js アプリケーションを開発する上で重要な側面です。未処理の例外をキャッチする場合でも、ユーザー入力を検証する場合でも、サードパーティ API の障害を適切に管理する場合でも、よく考えられたエラー処理戦略により、何時間ものデバッグ時間を節約し、スムーズなユーザー エクスペリエンスを確保できます。このブログでは、Express.js でのエラー処理の高度なテクニックを実際の例に基づいて詳しく説明します。

エラー処理が重要な理由
ソフトウェア開発ではエラーは避けられませんが、優れたアプリケーションと優れたアプリケーションを分けるのは、それらのエラーをいかに効果的に管理できるかです。高度なエラー処理に投資する主な理由は次のとおりです。

  • デバッグの改善: 問題の根本原因を迅速に特定します。
  • ユーザーエクスペリエンスの強化: ユーザーフレンドリーなエラーメッセージを配信します。
  • セキュリティ: エラー応答で機密データが公開されるのを防ぎます。

集中エラーハンドラーのセットアップ

集中エラー処理ミドルウェアにより、Express.js アプリ全体のエラー管理が簡素化されます。

作成方法は次のとおりです:

// errorHandler.js
const errorHandler = (err, req, res, next) => {
  console.error(err.stack);

  const statusCode = err.status || 500; // Default to 500 for unexpected errors
  const message = err.message || 'Internal Server Error';

  res.status(statusCode).json({
    success: false,
    message,
  });
};

module.exports = errorHandler;

アプリでの使用法:

const express = require('express');
const errorHandler = require('./middleware/errorHandler');

const app = express();

// Your routes go here

app.use(errorHandler); // Centralized error handler
app.listen(3000, () => console.log('Server running on port 3000'));

ミドルウェアによる非同期エラーの処理

ヘルパー関数を使用して、非同期ルート ハンドラーでの try-catch ブロックの重複を回避します。

const asyncHandler = (fn) => (req, res, next) =>
  Promise.resolve(fn(req, res, next)).catch(next);

使用例:

app.get('/data', asyncHandler(async (req, res) => {
  const data = await fetchData(); // Assume this is an async function
  res.json({ success: true, data });
}));

このアプローチにより、fetchData 内のエラーはすべて集中エラー ハンドラーに自動的に渡されます。

Express.js でのエラー処理用の一般的なライブラリ:express-async-errors

express-async-errors ライブラリは、Express.js アプリケーション内の非同期コードのエラーを処理するためのシンプルで広く使用されているソリューションです。

インストール:

npm install express-async-errors

使用法:

require('express-async-errors'); // Import the library
const express = require('express');
const app = express();

app.get('/data', async (req, res) => {
  const data = await fetchData(); // If this fails, the error is handled automatically
  res.json({ success: true, data });
});

// Centralized error handler
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ success: false, message: 'Something went wrong!' });
});

app.listen(3000, () => console.log('Server running on port 3000'));

express-async-errors ライブラリは、非同期関数のエラーをシームレスに処理することでコードの可読性を高め、定型文を削減します。

捕捉されないエラーの処理

アプリが未処理の拒否とキャッチされなかった例外を処理できるようにします。

process.on('unhandledRejection', (reason, promise) => {
  console.error('Unhandled Rejection:', reason);
  // Add your cleanup logic here
  process.exit(1);
});

process.on('uncaughtException', (err) => {
  console.error('Uncaught Exception:', err);
  // Add your cleanup logic here
  process.exit(1);
});

ライブラリでの検証エラー

Joi などのライブラリを入力検証に活用し、エラー処理をシームレスに統合します。

Joi の例:

const Joi = require('joi');

const validateUser = (req, res, next) => {
  const schema = Joi.object({
    name: Joi.string().min(3).required(),
    email: Joi.string().email().required(),
  });

  const { error } = schema.validate(req.body);
  if (error) {
    return next(new Error(error.details[0].message));
  }

  next();
};

app.post('/user', validateUser, (req, res) => {
  res.json({ success: true, message: 'User created successfully!' });
});

Express.js でのエラー処理のベスト プラクティス

  • 機密情報を漏洩しない: 運用環境でスタック トレースやデータベースの詳細を公開することは避けてください。
  • 適切な HTTP ステータス コードを使用する: 応答で正しいステータス コードが使用されていることを確認します (例: クライアント エラーの場合は 400、サーバー エラーの場合は 500)。
  • エラーを効果的にログに記録する: Winston や Pino などのログ ライブラリを実稼働グレードのエラー ログに使用します。
  • エラー処理をテストする: 開発中にエラーをシミュレートして、ハンドラーが期待どおりに動作することを確認します。

このブログが役立つと思われた場合は、❤️ の「いいね!」を押してフォローして、JavaScript のヒントやコツをさらにご覧ください。

以上がExpress.js での高度なエラー処理をマスターして堅牢な Node.js アプリケーションを実現するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。