Express обработка ошибок электронной почты, для вложенного промежуточного ПО - PullRequest
0 голосов
/ 29 января 2020

У меня есть express маршрут для обработки сброса пароля, и с этим у меня есть маршрут, где я сначала нахожу пользователя и имею некоторую обработку ошибок, но теперь я хочу дополнительную обработку ошибок во вложенной функции, и я не уверен, какой шаблон использовать

function triggerPasswordResetEmailSend(req, res, next) {
    var email = req.body.email;
    if (!email) return res.status(422).json({error: "Please provide an email."});
    UserRepositoryClass.findUserByEmail(email).then(user =>{
    if(!user) return res.status(422).json({message: "User not found"})
    sendPasswordReset(user);
    return res.status(200).json({user: user});
    }).catch(err =>{
        return res.status(500).json({error: err})
    }); 
  }

Внутри этой функции я делаю некоторую начальную обработку ошибок. Теперь проблема в том, что функция sendPasswordReset также может выдавать ошибки, но функция .catch() не перехватывает их, поэтому я ищу что-то для обработки этой функции.

Я пытался передать объекты req and res в функцию, но это не похоже на хорошее решение. Я мог бы попытаться поймать или, возможно, вернуть обещание. Но я хочу убедиться, что я следую той же схеме и лучшим методам, которые я уже пытался сделать.

Вот фрагмент кода из моей почтовой функции:

module.exports = (user) => {
  const userResetToken = generatePasswordToken();
  UserRepositoryClass.setPasswordResetToken(user.id, userResetToken);
  const passwordResetUrl = PASSWORD_RESET_URL(user._id, userResetToken);
  return sendMail(options(user.email, passwordResetUrl));
}

1 Ответ

1 голос
/ 29 января 2020

Вы можете использовать обещание вместо функции.

module.exports.sendPasswordReset = user = new Promise((resolve, reject) => {
  const userResetToken = generatePasswordToken();

  UserRepositoryClass.setPasswordResetToken(user.id, userResetToken);

  const passwordResetUrl = PASSWORD_RESET_URL(user._id, userResetToken);

  sendMail(options(user.email, passwordResetUrl))
    .then(response => {
      resolve(response, null); // we can get result as (data,error) here error is null
    })
    .catch(err => {
      reject(null, err); // here response is null
    });
});

Вы можете использовать sendPasswordReset Promise следующим образом:

sendPasswordReset(user).then((res, err) => {
  // here you can get your res as well as err

  if (err) throw new Error("Error while sending an email");

  console.log("response", res);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...