Возвращение new Promise()
внутри функции async
является антипаттерном: async
функция уже возвращает обещание, поэтому вам нужно только явно вернуть значение, которое обещание должно разрешить к.
Проблема, которую вы описываете, вызвана тем, что вы не выходите из своей функции, как только узнаете причину ее сбоя: функция все равно продолжит выполнение остальной части кода, если вы не сделаете этого. return
или throw
.
Для решения обеих проблем ваш код можно переписать следующим образом:
const registerUser = async (email: string, password: string): Promise<User> => {
if (!email || !password) {
throw new Error('Invalid E-mail address or Password.');
}
if (!EmailValidator.validate(email)) {
throw new Error('Invalid E-mail address.');
}
let user: any = await User.findOne({email})
if (user) {
throw new Error('E-mail address already in use.');
}
user = new User({
_id: new mongoose.Types.ObjectId(),
email: email,
password: password
});
return user.save();
};
Обратите внимание, что throw
внутри функции async
даст обещание (что async
функция всегда возвращает) отклонить с указанием предоставленной вами причины.
Обратите также внимание, что в случае успеха значение разрешения здесь является обещанием (user.save()
) , так что это означает, что обещание функции async
свяжет ее разрешение с разрешением , которое обещает.