score:2

Accepted answer

I was having a similar issue recently and haven't figured out the actual reason behind this, but as a workaround try telling mongoose explicitly that the expirationDate-field was changed:

req.user.expirationDate = new Date(
    req.user.expirationDate.setDate(req.user.expirationDate.getDate() + 30)
);
req.user.markModified('expirationDate');
await req.user.save();

EDIT:

Just debugged it again and I think the reason behind this behaviour is your default value for expirationDate. Try passing it the Date.now function instead of immediately setting it to a new date:

expirationDate: {type: Date, default: Date.now},

This fixed it for me without having to use markModified().

score:0

Although we still have some unsolved issues on why the same set of codes works differently. I have decided not to deal with it for the moment. Here's my solution to the original problem: change the datatype from Date to String. Here's the new set of codes:

Creating User schema at the frontend:

const userSchema = new Schema(
  {
    profileId: String,
    expirationDate: { type: String, default: new Date().toDateString() },
    credits: { type: Number, default: 0 },
  },
  { timestamps: { createdAt: "created_at" } }
);

Updating user at the backend to MongoDB Atlas::

d = new Date(req.user.expirationDate);

req.user.expirationDate = new Date(
    d.setDate(d.getDate() + 30)
  ).toDateString();
  req.user.credits += 1;

const user = await req.user.save();

console.log(typeof req.user.expirationDate);//Checking the datatype of "expirationDate"

Related Query

More Query from same tag