Node.js 如何仅从一个键过滤对象并将其作为json返回?
我有一个后端路由,从中获取所有用户数据并将其作为json返回。我想过滤所有这些数据,不转发散列密码。我该怎么做?我当前的代码:Node.js 如何仅从一个键过滤对象并将其作为json返回?,node.js,json,reactjs,express,axios,Node.js,Json,Reactjs,Express,Axios,我有一个后端路由,从中获取所有用户数据并将其作为json返回。我想过滤所有这些数据,不转发散列密码。我该怎么做?我当前的代码: router.get("/", isLoggedIn, (req, res, next) => { User.findById(req.user._id) .then((user) => { console.log("Fetching user data, remove password", u
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 });
});
})
) 方法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 });
});
})
方法2:创建一个覆盖密码属性的新对象
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 });
});
})
方法3:这是猫鼬文件?您需要先将其转换为标准对象
let filteredUser = user.toObject();
delete filteredUser.password;
res.status(200).json(filteredUser);
如果您使用的是
mongoose
,则可以使用函数筛选属性:
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 });
});
})
如果我运行这个代码:
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
您只需删除不想发送的密钥delete user.password
,或将该对象解包到较小的属性子集const{password,…rest}=user
并将rest与您的响应一起发送回去,但它仍然发送密码/我试过了,但它仍然返回密码^^给了你第二种方法它仍然发送密码,我也试过了…res,但它没有改变任何东西。你的用户对象是什么样子的?对象创建日期:“2021-02-18T14:57:23.403Z”电子邮件:mnblski@gmail.com“密码:“$2b$10$JPSh6.lHcW756MKl4G.h1ucy4xdsp8u0rbmx1mwhvc9ovfsbzyme6g”profilePic:“更新日期:”2021-02-18T14:57:23.403Z”用户名:“Marcel600”\uu v:0\u id:“602e8053210e318048c3aa8”“\uuuu proto\uuuuu:Object
它仍然发送密码,我用…res尝试过,但它没有改变任何东西。也就是说,我简化了我的答案,您要删除的属性是“password”?是的,我正在将带有用户数据的对象传递到前端,但我只想跳过传递密码以获得额外的安全性。我更新了答案,如果您使用的是mongodb,则可以使用selectYour welcome,原因是Model.findById()返回的是查询对象,而不是数据