Почему бы не попробовать поймать блоки ловить исключения - PullRequest
0 голосов
/ 17 апреля 2020

Так что у меня есть этот кусок кода, который работает нормально, но если есть ошибка с типом данных, блоки try catch не работают. Похоже, мне придется проверить все типы данных перед их использованием, чтобы убедиться, что мой сервер не обрабатывает sh.

Например, в следующем коде, если токены по какой-то причине не были массивом , когда выдается ошибка, мой 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);

  }
});

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Я боролся с этим, так как это легко упустить из виду в документации, но для ошибок, возвращаемых асинхронными функциями, вызванными обработчиками маршрутов и промежуточным программным обеспечением, вы должны передать их функции 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)
    }
  })
})

Вы также можете написать свой собственный обработчик ошибок , долго читать, но это сэкономит вам много времени.

0 голосов
/ 17 апреля 2020

try catch не работает с then

Можно ли изменить код для использования обещаний с await / async?

Вы можете использовать try catch с ним

...