Почему код не работает, если в промежуточном ПО нет asyn c? - PullRequest
0 голосов
/ 08 мая 2020
    curUser.password = newPassword;
  curUser.passwordConfirm = passwordConfirm;
  await curUser.save();

У меня есть этот код для выполнения в этой функции:

    exports.updatePassword = catchAsync(async (req, res, next) => {
  // 1-) Get user from the collection
  const { currentPassword, newPassword, passwordConfirm } = req.body;

  const curUser = await User.findById(req.user.id).select('+password');

  if (!curUser) {
    return next(new AppError('Token is invalid !', 404));
  }

  // 2-) Check if posted current password is correct
  if (!(await curUser.correctPassword(curUser.password, currentPassword))) {
    return next(new AppError('Password is incorrect !', 401));
  }

  curUser.password = newPassword;
  curUser.passwordConfirm = passwordConfirm;
  await curUser.save();
  //findByIdAndUpdate yerine save ederek kullanmamızın sebebi oluşturmuş olduğumuz pre middlewareleri ile validatorların update işleminde
  //çalışmayacak olması

  //3-) Log user in, send JWT
  createTokenAndSend(200, res, curUser._id);
});

И выше у меня есть одно промежуточное ПО в userModel для создания passwordChangedAt в базе данных, когда пользователь обновил свой пароль:

userSchema.pre('save', async function(next) {
  if (!this.isModified('password') || this.isNew) return next();
  //Eğer yeniyse bu fonksiyonu çalıştırmamasını ve direk diğer middleware'e geçmesini belirttik

  this.passwordChangedAt = Date.now - 1000;
});

Итак, проблема в том, почему этот метод промежуточного программного обеспечения должен быть asyn c. Когда я удаляю 'asycn' до этой функции промежуточного программного обеспечения, я получаю ошибку в почтальоне. На самом деле это не ошибка, просто посмтан не может получить такой ответ: Это изображение этого

Итак, почему у меня возникает эта проблема, когда я удаляю asyn c из этого предварительного промежуточное ПО?

1 Ответ

0 голосов
/ 08 мая 2020

Ваше промежуточное программное обеспечение должно либо вызвать функцию next, либо вернуть обещание (которое в конечном итоге будет выполнено), иначе оно никогда не будет считаться выполненным, что приведет к вашему бесконечному запросу. (https://mongoosejs.com/docs/middleware.html)

Если вы посмотрите на свое промежуточное программное обеспечение, оно показывает, что вы не вызываете следующий, если !this.isModified('password') || this.isNew оценивается как false. Следовательно, если промежуточное ПО не возвращает обещание, оно никогда не будет считаться выполненным.

Использование async преобразует вашу функцию в возврат обещания, тем самым подчиняясь контракту промежуточного ПО.

Как вариант, попробуйте удалить async и добавить next(); в конец функции после обновления passwordChangedAt.

...