我正在使用express和mongodb创建一个博客应用程序。我想将身份验证详细信息和配置文件信息保存在单独的表中。用户注册后创建个人资料。
我的问题是,如果创建配置文件时发生错误,将创建用户,但他们的配置文件将不存在。有没有办法确保同时创建用户和配置文件?否则,在前端,我需要在每次用户登录时获取配置文件并检查它是否为空并导航到配置文件创建页面。这是我的代码。
const { username, email, password } = req.body;
try {
let user = await User.findOne({ email });
if (user) {
return res
.status(400)
.json({ msg: 'User already exists' });
}
user = new User({
username,
email,
password,
});
user.password = await bcrypt.hash(password, 10);
await user.save();
const profileFields = {};
profileFields.user = req.user.id;
profileFields.name= "";//or null?
profileFields.bio = "";
profileFields.location = "";
profile = new Profile(profileFields);
await profile.save();
对于交易,长答案是肯定的。
简短的回答是肯定的,有一个 catch 块。
如果您的
await user.save();
不成功,它将抛出一个错误,然后您可以捕获它。这意味着 await profile.save();
永远不会被执行,这很好。现在,如果 await user.save();
成功,但 await profile.save();
抛出错误,那么您所要做的就是删除 user
。像这样修改你的代码:
try {
let user = await User.findOne({email});
if (user) {
return res
.status(400)
.json({msg: 'User already exists'});
}
user = new User({
username,
email,
password,
});
user.password = await bcrypt.hash(password, 10);
await user.save();
const profileFields = {};
profileFields.user = req.user.id;
profileFields.name = "";//or null?
profileFields.bio = "";
profileFields.location = "";
let profile = new Profile(profileFields);
await profile.save();
}catch(err){
console.log(err);
await User.findByIdAndDelete(user._id);
return res
.status(500)
.json({msg: 'Error in user creation'});
}
findByIdAndDelete 发出 MongoDB
findOneAndDelete()
,其中:
查找匹配的文档,将其删除,然后返回找到的文档(如果有)。
因此,您可以在
catch
块内执行 findByIdAndDelete
,而不必过多担心文档是否存在。