Home > Mobile >  Mongoose How to await updating documents?
Mongoose How to await updating documents?

Time:08-12

im trying to figure out why my code isnt awaiting the update method in mongoose.

First I have tried to find the user

//Find user

 const user = await User.findOne({
    username,
    active: { $ne: false },
    accessBanExpires: { $lt: Date.now() },
  }).select(' password');

//Update the user property

 let newuser;

  if (remember) {
    if (!user.rememberAcct) {
      newuser = await User.findOneAndUpdate(user._id, {
        rememberAcct: true,
      });
      console.log('check: ', user.rememberAcct);
    }
  } else if (user.rememberAcct) {
    await user.updateOne({
      rememberAcct: false,
    });
  }
  console.log(user.rememberAcct, newuser);  //Here document always updating asyncrounously, but await seems not applying to update. newUser returns the user with old property

document always updating asyncrounously, but await seems not applying to update. newuser returns the user with old property

Update:

with options {returnDocument: 'after'} or {new: true} is still returning old document.

Refers: https://mongoosejs.com/docs/api.html#model_Model-findOneAndUpdate

What Im missing here?

newuser = await User.findOneAndUpdate(user._id, {
        rememberAcct: true,
      }, {returnDocument: 'after'});

CodePudding user response:

Your should either use findByIdAndUpdate, or pass a proper query:

// Either:
await User.findByIdAndUpdate(
  user._id,
  {
    rememberAcct: true
  },
  {
    returnDocument: 'after'
  }
);

// Or:
await User.findOneAndUpdate(
  {
    _id : user._id,
  },
  {
    rememberAcct: true
  },
  {
    returnDocument: 'after'
  }
);

CodePudding user response:

In your snippet, there are 3 mistakes

1st

const user = await User.findOne({
  username,
  active: { $ne: false },
  accessBanExpires: { $lt: Date.now() },
}).select(' password') // <-- missing `rememberAcct` to select, without it `user.rememberAcct` will always be `undefined`

2nd

await user.updateOne({ // <-- this should be `User` not `user`
  rememberAcct: false, // <-- this filter will select a random user &  update query is missing
})

3rd :- Not using user.save() to update user.

here is final solution.

const user = await User.findOne(
  {
    username,
    active: { $ne: false },
    accessBanExpires: { $lt: Date.now() },
  },
  { password: 1, rememberAcct: 1 }
)

if (!user) throw new Error('user not found')

console.log('user.rememberAcct (before)', user.rememberAcct)

if (remember) {
  if (!user.rememberAcct) {
    user.rememberAcct = true
    await user.save()
  }
} else if (user.rememberAcct) {
  user.rememberAcct = false
  await user.save()
}

// NOTE: above `if/else` statements can be boiled down into single `if/else` statement, no need to check more than once. 
// I leave it you figure it out.

console.log('user.rememberAcct (after)', user.rememberAcct)

CodePudding user response:

I believe you need to place them into a try catches, let me know if the below works

this ads some error handling as well so you know why it may have failed.

 async function yourfunctionorrequest() {

  let password

    try {
      

        const user = await User.findOne({
            username,
            active: {
                $ne: false
            },
            accessBanExpires: {
                $lt: Date.now()
            },
        }, function (err, docs) {


            // set the specific item you were after to the variable
            password = docs.password
        })
    } catch (e) {
        console.log(e)

    }
    let newuser;

    if (remember) {
        if (!user.rememberAcct) {

            try {
                newuser = await User.findOneAndUpdate(user._id, {
                    rememberAcct: true,
                });
                console.log('check: ', user.rememberAcct);

            } catch (e) {
                console.log(e)
            }


        } else if (user.rememberAcct) {

            try {
                await user.updateOne({
                    rememberAcct: false,
                });
            } catch (e) {
                console.log(e)
            }

        }
        console.log(user.rememberAcct, newuser); //Here document always updating asyncrounously, but await seems not applying to update. newUser returns the user with old property




        console.log("error message", e)
    }


}
  • Related