首页 >web前端 >js教程 >在 Node.js 中构建简单有效的错误处理系统

在 Node.js 中构建简单有效的错误处理系统

DDD
DDD原创
2024-11-30 15:29:11173浏览

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 应用程序中有一条路线,用户可以在其中提交表单,但缺少某些字段。您可以像这样使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn