如何在猫鼬模型中实现交易概念?



我有三个模型"userLogin.js","userDetail.js"和"userAddress.js"。我希望数据应该同时存储,如果发生任何错误,它应该回滚所有插入操作。我给我的错误用户没有定义.尝试修复它们时,它会给出错误"架构未注册"

const UserLogin=require("../models/userLogin");
const UserDeatil=require("../models/userDetail");
var myModelSchema1 = require('mongoose').model('UserLogin').schema;
var myModelSchema2 = require('mongoose').model('UserDeatils').schema;
exports.user_signup = (req, res, next) => {
UserLogin.find({ email: req.body.email })
.exec()
.then(user => {
if (user.length >= 1) {
return res.status(409).json({
message: "Mail exists"
});
} else {
bcrypt.hash(req.body.password, 10, (err, hash) => {
if (err) {
return res.status(500).json({
error: err
});
} else {
const user = new UserLogin({
_id: new mongoose.Types.ObjectId(),
email: req.body.email,
password: hash,
loginDate:req.body.logindate,
});
const userdetils = new UserDeatil({
_id: new mongoose.Types.ObjectId(),
userId:result.userID,
userName:req.body.username,
dob:req.body.dob,
gender:req.body.gender,
photo: req.file? req.file.path : null,
imei:req.body.imei,
});
insertUsers();

}
});
}
});
};
async function insertUsers(){
try{
const id= transaction.insert(myModelSchema1, user);
const id1= transaction.insert(myModelSchema2, userdetils);
const final = await transaction.run();
}
catch(error){
console.error(error);
const rollbackObj = await transaction.rollback().catch(console.error);
transaction.clean();
c
}
}

首先,当您定义用户架构时,电子邮件必须是Uniqe,当您尝试使用相同的电子邮件创建另一个用户文档时失败时,

有了这个约定,你可以像这样前进:

const UserLogin=require("../models/userLogin");
const UserDeatil=require("../models/userDetail");
cosnt signup = async (req ,res)=>{
const { email , password ,...details} = req.body
const createdDocs = []
const hashedPwd = hash(password);
try{
const user = new UserLogin({ email , password: hashedPwd });
await user.save()
createdDocs.push(user)

const userDetails = new UserDetails({...details,userId:user._id});
await userDetails.save()

createdDocs.push(userDetails)
catch(err){
res.json({ status:false, message:err.message})
//emulates the rollback when any thing fails on the try flow 
if(createdDocs.length){
const operationsToRollBack = createdDocs.map(doc=>doc.remove)
await Promise.all(operationsToRollBack)
}
}

MongoDB支持从4.0版本开始的多文档事务。

理想情况下,如果您需要事务数据库,则应使用 SQL 类型 db。 但是,如果您仍然想在需要交易的同时享受MongoDB,他们为此引入了一个API - https://docs.mongodb.com/manual/core/transactions/

最新更新