I have a database that has a structure to this. I’ve updated the values clearly, but the idea remains. I’m trying to essentially find the refresh token and update it with a new token. Here is the database structure sample
{
"_id": "xxxxxxxxxxxxxxxxx",
"username": "[email protected]",
"refreshTokens": [
{
"refreshToken": "token_example_1",
"_id": "xxxxxxxxxxxxxxxxx"
}
],
"salt": "salted_stuff",
"hash": "hashed_stuff",
"__v": 1
}
Here is my schema structure
const session = new Schema({
refreshToken: {
type: String,
default: '',
},
});
const userSchema = new Schema({
password: String,
refreshTokens: [session],
});
userSchema.set('toJSON', {
transform: function (doc, ret, options) {
delete ret.refreshToken;
return ret;
},
});
Now, what I’m trying to do to update it is
User.findOneAndUpdate(
{ _id: userId, refreshTokens: { $elemMatch: { refreshToken: refreshToken } } },
{ $set: { 'refreshTokens.$.refreshToken': newRefreshToken } }
);
newRefreshToken is built from another function and userId is a variable based off another function of retrieving that internally. Both of those are working as I’ve consoled logged them and can see they are correct.
When I check the database, the refreshToken doesn’t change after running the query.
Am I doing something wrong here? The original user creation and everything works fine so I know the connection is there and it’s not returning any errors. Even this update isn’t returning errors. It’s just not updating the data.
I have scoured multiple other questions and forums. I tried mongoplayground and it seemed to work, so not sure why it’s not actually working.
I’ve also tried
User.updateOne(
{ _id: userId, refreshTokens: { $elemMatch: { refreshToken: refreshToken } } },
{ $set: { 'refreshTokens.$.refreshToken': newRefreshToken } }
);
and
User.findOneAndUpdate(
{ _id: userId, 'refreshTokens.refreshToken': refreshToken } } },
{ $set: { 'refreshTokens.$.refreshToken': newRefreshToken } }
);
No success so far. And if I try to do a
.then((user) => {user.save()})
I get an error saying that is not a function.
2
Answers
For anyone else that runs across this with the same issue...
I ended up having to set the .post as an asyn function and then use .await plus .exec() for the findOneAndUpdate function like below
This forced the database to update before creating the new cookie and storing the new token.
I notice that you have 2 extra brackets in your original code. The fix is below:
Maybe instead of
You can try: