ホームページ > ウェブフロントエンド > jsチュートリアル > Node.js でのシンプルで効果的なエラー処理システムの構築

Node.js でのシンプルで効果的なエラー処理システムの構築

DDD
リリース: 2024-11-30 15:29:11
オリジナル
228 人が閲覧しました

Building a Simple and Effective Error-Handling System in Node.js

Web アプリケーションを構築するとき、物事は常に計画どおりに進むとは限りません。ユーザーが無効な操作を試みたり、データが欠落したり、予期しないバグが発生したりする可能性があります。これらのエラーを適切に処理することは、信頼性の高いアプリケーションを作成し、優れたユーザー エクスペリエンスを提供するために不可欠です。

この投稿では、Node.js アプリケーションにシンプルで効果的なエラー処理システムを実装する方法を説明します。飛び込んでみましょう! ?

エラー処理の基本

JavaScript では、エラーは通常、Error クラスのインスタンスとして表されます。何か問題が発生した場合、エラーを「スロー」することができ、アプリケーションはそれをキャッチしてそれに応じて応答できます。ただし、大規模なアプリケーションでは、基本的な Error クラスだけでエラーを管理すると面倒になる可能性があります。

ここでカスタム エラー クラスが役に立ちます!
カスタムエラークラスの作成

これは、構造化された意味のあるエラーを定義するために使用できる AppError というクラスです。

1

2

3

4

5

6

7

8

9

export class AppError extends Error {

    constructor(name, httpCode, description, isOperational, errors = []) {

        super(description); // Call the parent class (Error) constructor

        this.name = name; // Name of the error (e.g., ValidationError)

        this.httpCode = httpCode; // HTTP status code (e.g., 400, 404, 500)

        this.isOperational = isOperational; // Flag to distinguish between operational and system errors

        this.errors = errors; // Optional array of detailed error messages

    }

}

ログイン後にコピー

どのように機能しますか?

  • 名前: ValidationError や NotFoundError などのエラーの種類を説明します。
  • httpCode: 適切な HTTP ステータス コード (不正なリクエストの場合は 400、サーバー エラーの場合は 500 など) を設定します。
  • 説明: エラーを説明するわかりやすいメッセージを提供します。
  • isOperational: エラーが予期されたもの (例: ユーザー入力の問題) か予期せぬもの (例: バグ) かを示すブール値のフラグ。
  • エラー: エラーに関するより具体的な詳細を含むオプションのリスト (検証エラーに役立ちます)。

シンプルなエラー処理ミドルウェア

カスタム エラー クラスができたので、アプリでこれらのエラーを処理する方法が必要です。ミドルウェアを入力してください:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

export const errorHandler = (err, req, res, next) => {

    if (err instanceof AppError) {

        // Handle operational errors

        res.status(err.httpCode).json({

            success: false,

            error: err.name,

            message: err.message,

            errors: err.errors || [],

        });

    } else {

        // Handle unexpected errors

        console.error('Unexpected Error:', err.stack); // Log the stack trace for debugging

        res.status(500).json({

            success: false,

            error: 'InternalServerError',

            message: 'Something went wrong. Please try again later.',

        });

    }

};

ログイン後にコピー

これは何をしますか?
エラーの種類を確認します:
エラーが AppError のインスタンスである場合、操作エラーとして扱われます。これらは、予期されるエラーです (検証の問題やリソースの不足など)。
AppError ではない場合は、予期しないエラーとして扱われます。これらはコード内のバグ、または計画外のバグである可能性があります。

1

2

3

Responds with the right status code and message:

    For AppError instances, it sends a structured JSON response containing the error details.

    For unexpected errors, it sends a generic 500 response to the user and logs the details for debugging.

ログイン後にコピー

すべてをまとめる

Express アプリにユーザーがフォームを送信するルートがあるが、一部のフィールドが欠落していると想像してください。 AppError クラスは次のように使用できます。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

app.post('/submit-form', (req, res, next) => {

    const { name, email } = req.body;

 

    if (!name || !email) {

        const errors = [];

        if (!name) errors.push({ field: 'name', message: 'Name is required.' });

        if (!email) errors.push({ field: 'email', message: 'Email is required.' });

 

        return next(new AppError('ValidationError', 400, 'Invalid input data.', true, errors));

    }

 

    res.json({ success: true, message: 'Form submitted successfully!' });

});

 

// Register the error-handling middleware

app.use(errorHandler);

ログイン後にコピー

エラーが発生した場合はどうなりますか?
名前または電子メールが欠落している場合、AppError インスタンスは次の関数に渡されます。
errorHandler ミドルウェアはそれをキャッチし、構造化された JSON 応答を送信します。

1

2

3

4

5

6

7

8

9

{

    "success": false,

    "error": "ValidationError",

    "message": "Invalid input data.",

    "errors": [

        { "field": "name", "message": "Name is required." },

        { "field": "email", "message": "Email is required." }

    ]

}

ログイン後にコピー

このパターンを使用する理由

  • 明確さ: カスタム エラー クラスにより、エラーがよりわかりやすくなり、デバッグが容易になります。
  • 一貫性: すべてのエラーは予測可能な構造に従っており、フロントエンド開発者が扱いやすくなります。
  • 懸念の分離: ルート ハンドラーはロジックに重点を置き、ミドルウェアはエラー応答を処理します。

結論
エラー処理は複雑である必要はありません。カスタム エラー クラスとミドルウェアを使用すると、アプリの信頼性とユーザーの満足度を維持する、堅牢で初心者に優しいシステムを構築できます。

このアプローチについてどう思いますか? Node.js でエラーを処理するためのヒントやコツはありますか?以下のコメント欄でお知らせください。

以上がNode.js でのシンプルで効果的なエラー処理システムの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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