如何仅从一个键中过滤对象并将其作为 json 返回?
Posted
技术标签:
【中文标题】如何仅从一个键中过滤对象并将其作为 json 返回?【英文标题】:How to filter object from one key only and return it as 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;
,然后将您的回复发送回来
它仍然发送密码;/
【参考方案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 );
);
)
【讨论】:
以上是关于如何仅从一个键中过滤对象并将其作为 json 返回?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SqlDataReader 之前知道或获取数组大小?并将其作为 json 返回