首頁 >web前端 >js教程 >在 Node.js 中建立簡單有效的錯誤處理系統

在 Node.js 中建立簡單有效的錯誤處理系統

DDD
DDD原創
2024-11-30 15:29:11172瀏覽

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

建立 Web 應用程式時,事情並不總是按計劃進行。使用者可能會嘗試無效的操作,資料可能會遺失,或者可能會出現意外的錯誤。優雅地處理這些錯誤對於創建可靠的應用程式和提供良好的用戶體驗至關重要。

在這篇文章中,我將向您展示如何在 Node.js 應用程式中實作簡單而有效的錯誤處理系統。讓我們深入了解一下! ?

錯誤處理的基礎知識

在 JavaScript 中,錯誤通常表示為 Error 類別的實例。當出現問題時,您可以“拋出”錯誤,並且您的應用程式可以捕獲它以做出相應的回應。然而,在較大的應用程式中,僅使用基本 Error 類別來管理錯誤可能會變得混亂。

這就是自訂錯誤類別派上用場的地方!
建立自訂錯誤類別

這是一個名為 AppError 的類,我們可以用它來定義結構化且有意義的錯誤:

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
    }
}

它是如何運作的?

  • name:描述錯誤的類型,例如 ValidationError 或 NotFoundError。
  • httpCode:設定適當的 HTTP 狀態碼,例如 400 表示錯誤請求,500 表示伺服器錯誤。
  • 描述:提供描述錯誤的使用者友善訊息。
  • isOperational:一個布林標誌,指示錯誤是預期的(例如,使用者輸入問題)還是意外的(例如,錯誤)。
  • 錯誤:可選列表,包含更多有關錯誤的具體詳細資訊(對於驗證錯誤很有用)。

一個簡單的錯誤處理中間件

現在我們有了自訂錯誤類,我們需要一種方法來在我們的應用程式中處理這些錯誤。輸入中間件:

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,則將其視為意外錯誤。這些可能是您的程式碼中的錯誤或您沒有計劃的事情。

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 應用程式中有一條路線,使用者可以在其中提交表單,但缺少某些欄位。您可以像這樣使用 A​​ppError 類別:

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 回應:

{
    "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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn