如何在node js express中构建集中的错误处理?



我正试图在node js应用程序中的错误处理工作。任何人都可以帮助我如何建立集中的错误处理,而不使用尝试和捕获块在每个api。我对怎么做有点困惑。谁来帮帮我。

我已经尝试在中间件中创建错误函数。

我最近需要做错误处理。所以,我查阅了很多资料,最后想出了这个。我们将创建一个custom Error classErrorHandler middleware。自定义错误类用于动态发送其他细节,如statusCode和errMsg。并且,中间件用于一次集中处理所有错误,基本上控制完整的错误并发送错误响应。

  1. 创建自定义Err

    class Err extends Error {
    statusCode = 500;
    name = "InternalError";
    err = "Error";
    constructor(message, options = {}) {
    super(message);
    for (const [key, value] of Object.entries(options)) {
    this[key] = value;
    }
    }
    }
    

Err类接受以下内容,而内置的Error类只接受message

  • message:无论你想显示给客户端
  • options:它可以包括与错误相关的附加信息,如
    • err(实际错误)
    • name(自定义/实际错误名称)
    • statusCode(如400,404等)
  1. 创建中间件ErrorHandler

    const errorHandler = (err, req, res, next) => {
    console.error(err);
    let errStatus = err.statusCode || 500; 
    let errMsg = err.message;
    //handling some basic mongodb error
    if(err.name === 'CastError') {
    errMsg = `Resource not found. Invalid: ${err.path}`;
    errStatus = 400;
    } else if(err.name === 'ValidationError') {
    errMsg = `Invalid input entered: ${Object.values(err.errors).map(e => e.message)}`;
    errStatus = 400;
    } else if(err.code === 11000) {
    errMsg = `Duplicate ${Object.keys(err.keyValues)} entered`;
    errStatus = 403;
    }
    //you can handle many more such in-built or basic errors like related to jwt, etc
    return res.status(errStatus).json({
    success: false,
    status: errStatus,
    message: errMsg,
    stack: process.env.ENV === 'DEV' ? err.stack : {}
    })
    }
    

现在,错误处理非常简单。

  • 当我们想抛出一个自定义错误时,我们可以这样做

    const err = throw new Err("Leaderboard not exist for this quiz", {
    err: "RedisError", 
    name: "EmptySetError", 
    statusCode: 422
    });
    

    [注意:不需要发送所有的选项,如果你想,你可以只发送statusCode.]

  • 或者如果我们从try中捕获错误…catch块

    try {
    //do your work like await call
    } catch (err) {
    }
    

我们可以像

这样修改控制器
const ctrl = (req, res, next) => {
//err is either custom or we are catching from try...catch
next(err);
}

我们将在index.js文件中所有路由的最后添加此中间件。

app.routes....
app.use(ErrorHandler);

最后,一些更好的错误处理技巧:

  1. 好友throw,try,catch与async/await同步
  2. 记录错误到服务器,由中间件处理。
  3. 使用Err类抛出自定义错误
  4. 集中处理错误将使调试和阅读代码变得容易。
  5. 提供正确的错误代码。

最新更新