【问题标题】:How to do error handling in a REST API with Express middleware routing如何使用 Express 中间件路由在 REST API 中进行错误处理
【发布时间】:2017-07-05 08:21:34
【问题描述】:

假设我们有一个带有以下路由的 REST API:

app.post("/accounts/:accountId", isAuthorized, isSelf, updateAccount);

在这种情况下,可能会出现很多问题。用户可能是未经授权的,因为他没有登录,或者因为他试图更新不属于他的帐户,或者他缺少所需的属性值。使用中间件,您可以提取某些验证,因此可以跨多个路由使用。

情况

我正在为此路由创建一个 POST,但我没有发送授权标头。 isAuthorized,成功捕获错误,而不是调用下一个函数,它将使用res.send(403) 或其他东西。 isSelfupdateAccount 函数会做类似的事情。

问题

我需要手动遵循所有函数的模式以返回类似的错误处理。作为开发人员,这很容易出错。因为当您需要在所有类型的文件中管理它时,很容易弄乱约定。

问题

管理错误的最简单方法是什么?

请注意,所有中间件函数都是自定义函数,因此可以按照通用方法编写它们。

【问题讨论】:

    标签: node.js rest express middleware


    【解决方案1】:

    游戏有点晚了,但这是我在基于 express 的 API 项目中处理错误的方式。

    发生错误的原因主要有两个。

    1. 用户尝试访问未定义的路由。

    2. 用户与数据库交互时可能会出错。这会直接抛出错误。

    对于第一种错误,我是这样处理的。

    app.use((req, res, next) => {
      const error = new Error('Not Found!');
      error.status = 404;
      next(error);
    });
    
    • 当你在定义完所有路由后声明这个中间件,当用户尝试请求一个无效的路由时,它会通过这个中间件。

    • 我正在使用 NodeJs 中的默认 Error 对象创建一个新的错误对象。然后我分配一个状态并将其传递给下一个主要错误处理程序。

    第二种类型的错误。这可能是由数据库相关错误或验证错误等引起的。

    这就是我处理这些的方式。

    app.use((error, req, res, next) => {
      res.status(error.status || 500);
      res.json({
        error: {
          message: error.message,
        },
      });
    });
    
    • 如果错误是来自上一个处理程序的未找到错误,则创建一个对象并发送错误详细信息。

    • 在数据库交互中,如果出现问题直接抛出错误,那么这个中间件会捕获它并为其分配一个状态,并从抛出的错误中获取消息并将其转换为一个对象并将其作为json返回。

    这是我发现的最方便的错误处理方式。

    我从here 学到了这一点。

    【讨论】:

      【解决方案2】:

      我会创建包含您经常运行的“测试”的函数。

      例子:

      function test1(req, res){
          if (typeof req.body.value != undefined){
              return true;
          } else {
              return false;
          }
      }
      

      【讨论】:

        【解决方案3】:

        您必须将最后一个中间件定义为错误处理函数,如下所示:

        app.use((err, req, res, next) => {
            res.status(err.status).json(err);
        });
        

        在你的路线中你可以这样做:

        app.get('/',() => {
            var err = {};
            err.message = 'Not found'
            err.status = 404;
            next(err)
        })
        

        【讨论】:

          【解决方案4】:

          我也是节点新手,我也面临这种情况,但我找到了一种方法,我在执行任何查询后插入一个函数,其中两个参数首先是“err”,其中包含任何错误,第二个参数是“数据”其中包含执行查询后将获得的数据。

          function(err, data){
            if(err){
              console.log(err)
            }
            console.log(data)
          }
          

          在我看来,这是在 Rest API 中最简单但有效的错误处理方式

          【讨论】:

            【解决方案5】:

            我在我的 nodejs express 服务器中主要做的是:

            if(err) {
              res.json({error:err})
              throw new Error(err)
            }
            else { 
             do other stuff
            }
            

            我不确定这是否是最佳实践,但我知道它会发送错误响应,并会在控制台中打印错误堆栈跟踪以便于调试。

            【讨论】:

              猜你喜欢
              • 2017-05-30
              • 1970-01-01
              • 2017-09-07
              • 2019-04-13
              • 2020-05-13
              • 1970-01-01
              • 2021-01-17
              • 2020-10-26
              • 1970-01-01
              相关资源
              最近更新 更多