Can I create an exception for pre middleware

Issue

Using node.js and mongoose, I have a basic /login route. In the database, there is a boolean active: true|false state property. When a user deletes their account using /deleteme route it to active: false and the user appears nowhere using schema.pre middleware /^find/. But I want to reactivate the user’s account whenever they try to log in. But it won’t work because the user can’t be found since the pre-middleware prevents the user to be found using any find method.

So long story short, can I create an exception to my schema.pre middleware that it will not get executed if it gets called by a specific middleware?

router.post('/login', authController.login);
router.delete('/deleteMe', userController.deleteMe);
userSchema.pre(/^find/, function (next) {
  this.find({ active: { $ne: false } });
  next();
});
exports.deleteMe = catchAsync(async (req, res, next) => {
  await User.findByIdAndUpdate(req.user.id, { active: false });

  res.status(204).json({
    status: 'success',
    data: null,
  });
});
exports.login = catchAsync(async (req, res, next) => {
  const { email, password } = req.body;

  if (!email || !password) {
    return next(new AppError('Please provide email and password', 400));
  }

  const user = await User.findOne({ email }).select('+password');

  if (!user || !(await user.correctPassword(password, user.password))) {
    return next(new AppError('Incorrect email or password', 401));
  }

  await User.findByIdAndUpdate(user.id, { active: true });
  createSendToken(user, 200, res);
});```

Solution

You can use updateOne method.

exports.deleteMe = catchAsync(async (req, res, next) => {
  await User.updateOne({_id: req.user.id}, { active: false });

  res.status(204).json({
    status: 'success',
    data: null,
  });
});

Answered By – Co┼čkun

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published