【问题标题】:How to filter object from one key only and return it as json?如何仅从一个键中过滤对象并将其作为 json 返回?
【发布时间】:2021-05-21 13:30:26
【问题描述】:

我有一个后端路由,它从中获取所有用户数据并将其作为 json 返回。我想过滤所有这些数据以不转发散列密码。我怎样才能做到这一点?我当前的代码:

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 });
    });
})

;

【问题讨论】:

  • 您可以删除您不想发送的键 delete user.password,或者将该对象解压缩到较小的属性子集 const {password, ...rest} = user;,然后将您的回复发送回来
  • 它仍然发送密码;/

标签: node.js json reactjs express axios


【解决方案1】:

方法一:删除属性

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 });
    });
})

方法二:新建对象覆盖密码属性

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 });
    });
})

方法三:这是一个Mongoose文件?您需要先将其转换为标准对象

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

【讨论】:

  • 我试过了,但它仍然返回密码^^
  • 给你第二种方法
  • 它仍然发送密码,我也试过 ...res 但它没有改变任何东西。
  • 你的user对象是什么样子的?
  • Object createdAt: "2021-02-18T14:57:23.403Z" email: "mnblski@gmail.com" password: "$2b$10$JPSh6.lHcW756MKl4G.H1uCY4xdsP8u0rBMX1MwHvC9OVFsBzYM6G" profilePic: "" updatedAt: "2021-02-18T14:57:23.403Z" username: "Marcel600" __v: 0 _id: "602e8053210e3318048c3aa8" __proto__: Object
【解决方案2】:

如果您使用mongoose,您可以使用Query.prototype.select() 函数来过滤属性:

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 });
    });
})

【讨论】:

  • 它仍然发送密码,我已经尝试使用 ...res 但它没有改变任何东西。
  • 这很奇怪,我简化我的回答,您要删除的属性是“密码”?
  • 是的,我正在将带有用户数据的对象传递到前端,但我只想跳过传递密码以提高安全性。
  • 我更新了我的答案,如果你使用的是 mongodb,你可以使用 select
  • 欢迎您,原因是 Model.findById() 返回的是 Query 对象,而不是数据
【解决方案3】:

如果我运行此代码:const { password, ...data } = user;...数据正在打印如下:

{
      '$__': 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

【讨论】:

    【解决方案4】:
    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 });
        });
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-22
      • 2022-01-06
      • 1970-01-01
      • 2011-03-06
      • 2015-12-11
      • 2018-01-28
      • 1970-01-01
      相关资源
      最近更新 更多