【问题标题】:Why isn't try catch blocks catching exceptions为什么不尝试捕获块捕获异常
【发布时间】:2020-07-31 09:50:27
【问题描述】:

所以我有这段代码可以正常工作,但如果数据类型有错误,try catch 块将无法正常工作。看来我必须在使用它们之前检查所有数据类型,以确保我的服务器不会崩溃。

例如在下面的代码中,如果由于某种原因令牌不是数组,则当错误 get 被抛出时,我的 try catch 没有捕获错误。相反,它正在使服务器崩溃。

router.patch("/updateDeviceToken", checkIfAuthenticated, (req, res) => {
  try {
    console.log("In updating contacts");
    console.log("body", req.body);
    User.findById(req.authId, (error, user) => {
      try {
        if (error) {
          console.log(error);
          console.log("user found");
          return res.status(404).json(error);
        }
        if (!user) return res.status(401).json("User not found");
        if (
          req.body.android &&
          !user.tokens.android.includes(req.body.android)
        ) {
          user.tokens.android.push(req.body.android);
          user
            .save()
            .then((user) => {
              console.log("token updated");
              return res.json("Token updated");
            })
            .catch((error) => res.status(404).json(error));
        } else if (req.body.iOS && !user.tokens.iOS.includes(req.body.iOS)) {
          user.tokens.iOS.push(req.body.iOS);
          user
            .save()
            .then((user) => {
              console.log("token updated");
              return res.json("Token updated");
            })
            .catch((error) => res.status(404).json(error));
        } else {
          console.log("token received but not updated");
          return res.json("Token received but not updated");
        }
      } catch (e) {
        console.log(e);
        return res.status(404).json("There was an error");
      }

    });
  } catch (e) {
    console.log(e);

  }
});

【问题讨论】:

  • 我不认为404 是您想要在服务器错误时返回的响应代码。您应该选择 5xx 响应代码。无论如何,在最外面的 catch 块中设置 res.status 是否有意义?
  • 您确定问题出在此处而不是在 checkIfAuthenticated 中间件中。你的 try/catch 应该可以处理几乎所有类型的错误。
  • 我是的,控制台错误只是发生在数据库中的数据类型方面。 checkifauthenticated 只是我编写的一种用于解码用户令牌并验证身份验证的方法。

标签: javascript node.js express error-handling try-catch


【解决方案1】:

try catch 不适用于then

您可以更改代码以使用带有await / async 的承诺吗?

你可以用 try catch 来处理它

【讨论】:

    【解决方案2】:

    我为此苦苦挣扎,因为它在文档中很容易被忽略,但是对于路由处理程序和中间件调用的异步函数返回的错误,您必须将它们传递给 next() 函数,Express 将在其中捕获并处理它们。例如:

    app.get('/', function (req, res, next) {
      fs.readFile('/file-does-not-exist', function (err, data) {
        if (err) {
          next(err) // Pass errors to Express.
        } else {
          res.send(data)
        }
      })
    })
    

    您也可以编写您的自定义error handler,长读但它会为您节省大量时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2011-12-05
      • 2012-08-27
      • 2010-09-28
      相关资源
      最近更新 更多