【发布时间】:2020-06-13 00:13:35
【问题描述】:
您好,我正在尝试在执行数据库操作之前检查无效案例。出于某种原因,我的代码将运行reject('Invalid E-mail address.');,但随后它还将继续运行await User.findOne({email}) 行。有几种方法可以重写它,但我想保留这段代码的当前结构。如何在拒绝后终止函数并阻止其余代码运行?谢谢
user.database.ts
export const registerUser = async (email: string, password: string): Promise<User> => {
return new Promise(async (resolve, reject) => {
// check if email or password are null
if (!email || !password) {
reject('Invalid E-mail address or Password.');
}
// check if email is invalid
if (!EmailValidator.validate(email)) {
reject('Invalid E-mail address.');
}
// check if database already contains E-mail address
await User.findOne({email}).then((user: any) => {
if (user) {
reject('E-mail address already in use.'); // code should stop here
}
});
// anything below should not run
// create user object
const user = new User({
_id: new mongoose.Types.ObjectId(),
email: email,
password: password
});
// save user object to database
await user.save().then((result: any) => {
resolve(result);
}).catch((error: any) => {
reject(error);
});
});
};
auth.controller.ts
export const register = (req: Request, res: Response) => {
const email = req.body.email;
const password = req.body.password;
registerUser(email, password).then((user: User) => {
res.status(200).json(user);
}).catch((error: any) => {
res.status(300).json(error);
});
};
【问题讨论】:
-
(1)
new Promise()包装器在这里是一个反模式。没有什么需要被承诺的。 (2)resolve与return不一样。 -
@Roamer-1888 所以我应该放弃使用承诺的想法吗?我添加了我使用此功能的方式。
-
不,只是放弃拥有
new Promise()包装器的想法。由于registerUser()是async,它将(1) 自动将任何返回值包装在Promise 中,(2) 异步抛出,(3) 允许使用await。 -
也可以使用
return reject()、return resolve()。返回并阻止继续。 -
@NSTuttle,直截了当,但
resolve和reject将在删除不必要的new Promise()包装器时消失。
标签: typescript promise async-await