建立 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 } }
它是如何運作的?
一個簡單的錯誤處理中間件
現在我們有了自訂錯誤類,我們需要一種方法來在我們的應用程式中處理這些錯誤。輸入中間件:
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 應用程式中有一條路線,使用者可以在其中提交表單,但缺少某些欄位。您可以像這樣使用 AppError 類別:
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中文網其他相關文章!