Как я могу реализовать концепцию транзакции в модели Мангуста? - PullRequest
1 голос
/ 19 октября 2019

У меня есть три модели: "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
          }

        }

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

сначала, когда вы определяете пользовательскую схему, электронное письмо должно быть уникальным, если при попытке создать другой пользовательский документ с тем же адресом электронной почты,

, и с этим соглашением вы можете продвигаться следующим образом:

 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)
  }

}

0 голосов
/ 21 октября 2019

MongoDB поддерживает многодокументные транзакции, начиная с версии 4.0.

В идеале, если вам нужна транзакционная база данных, вы должны использовать тип SQL db. Но если вы все еще хотели бы наслаждаться MongoDB, когда нуждаетесь в транзакциях, они представили API для этого - https://docs.mongodb.com/manual/core/transactions/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...