How to filter object from one key only and return it as json?

Viewed 83

I have a back end route that fetches all the user data from and returns it as json. I would like to filter all that data to not forward the hashed password. How can I do that? My current code:

router.get("/", isLoggedIn, (req, res, next) => {
  User.findById(req.user._id)
    .then((user) => {
      console.log("Fetching user data, remove password", user);
      res.status(200).json(user);
    })
    .catch((err) => {
      console.log(err);
      res.status(500).json({ errorMessage: err.message });
    });
})

;

4 Answers

If you are using mongoose you can use Query.prototype.select() function to filter the properties:

router.get("/", isLoggedIn, (req, res, next) => {
  User.findById(req.user._id).select("-password") //--> prefixing a path with - will flag that path as excluded
    .then((user) => {
      res.status(200).json(user);
    })
    .catch((err) => {
      console.log(err);
      res.status(500).json({ errorMessage: err.message });
    });
})

Method 1: Delete the property

router.get("/", isLoggedIn, (req, res, next) => {
  User.findById(req.user._id)
    .then((user) => {
      delete user.password;
      res.status(200).json(user);      
    })
    .catch((err) => {
      console.log(err);
      res.status(500).json({ errorMessage: err.message });
    });
})

Method 2: Create a new object overwriting the password property

router.get("/", isLoggedIn, (req, res, next) => {
  User.findById(req.user._id)
    .then((user) => {
      user = Object.assign({}, user, {password: null});

      res.status(200).json(user);      
    })
    .catch((err) => {
      console.log(err);
      res.status(500).json({ errorMessage: err.message });
    });
})

Method 3: This is a Mongoose document? You need to convert it to a standard object first

let filteredUser = user.toObject();
delete filteredUser.password;
res.status(200).json(filteredUser); 

If I run this code : const { password, ...data } = user; the ...data is being printed like below:

{
      '$__': InternalCache {
        strictMode: true,
        selected: {},
        shardval: undefined,
        saveError: undefined,
        validationError: undefined,
        adhocPaths: undefined,
        removing: undefined,
        inserting: undefined,
        saving: undefined,
        version: undefined,
        getters: {},
        _id: 602e8ecd9ffbba1c133db8ce,
        populate: undefined,
        populated: undefined,
        wasPopulated: false,
        scope: undefined,
        activePaths: StateMachine {
          paths: [Object],
          states: [Object],
          stateNames: [Array]
        },
        pathsToScopes: {},
        cachedRequired: {},
        session: undefined,
        '$setCalled': Set {},
        ownerDocument: undefined,
        fullPath: undefined,
        emitter: EventEmitter {
          _events: [Object: null prototype] {},
          _eventsCount: 0,
          _maxListeners: 0,
          [Symbol(kCapture)]: false
        },
        '$options': { skipId: true, isNew: false, willInit: true, defaults: true }
      },
      isNew: false,
      errors: undefined,
      '$locals': {},
      '$op': null,
      _doc: {
        profilePic: '',
        _id: 602e8ecd9ffbba1c133db8ce,
        username: 'mnblski5000',
        email: 'xxi@gmail.com',
        password: '$2b$10$i.sbWZuPF1dro.5OAegfie5BeyrHvH5vHWWbnWI9isRDDczkoy2eK',
        createdAt: 2021-02-18T15:59:09.899Z,
        updatedAt: 2021-02-18T15:59:09.899Z,
        __v: 0
      },
      '$init': true
router.get("/", isLoggedIn, (req, res, next) => {
  User.findById(req.user._id)
    .then((user) => {
      const filteredUser = {...user, password: undefined};

      res.status(200).json(filteredUser);
    })
    .catch((err) => {
      console.log(err);
      res.status(500).json({ errorMessage: err.message });
    });
})
Related