当用户向我的API注册时,会返回一个用户对象。在返回对象之前,我删除了散列密码和salt属性。我必须使用
user.salt = undefined;
user.pass = undefined;
因为当我尝试
时delete user.salt;
delete user.pass;
对象属性仍然存在并被返回。
为什么?
答案 0 :(得分:35)
要使用delete
,您需要通过调用toObject
将模型文档转换为纯JavaScript对象,以便您可以自由地操作它:
user = user.toObject();
delete user.salt;
delete user.pass;
答案 1 :(得分:4)
无法重新配置或删除不可配置的属性。
您应该使用严格模式,这样您就会遇到面对面的错误而不是无声的失败:
(function() {
"use strict";
var o = {};
Object.defineProperty(o, "key", {
value: "value",
configurable: false,
writable: true,
enumerable: true
});
delete o.key;
})()
// TypeError: Cannot delete property 'key' of #<Object>
答案 2 :(得分:3)
与其通过toObject()
转换为JavaScript对象,不如通过 Query.prototype.select() 函数选择要排除的属性,可能更理想。
例如,如果您的用户架构如下所示:
const userSchema = new mongoose.Schema({
email: {
type: String,
required: true,
},
name: {
type: String,
required: true
},
pass: {
type: String,
required: true
},
salt: {
type: String,
required: true
}
});
module.exports = {
User: mongoose.model("user", userSchema)
};
然后,如果您想在包含所有用户数组的响应中排除pass
和salt
属性,则可以通过以下方式专门选择要忽略的属性:在财产名称:
users.get("/", async (req, res) => {
try {
const result = await User
.find({})
.select("-pass -salt");
return res
.status(200)
.send(result);
}
catch (error) {
console.error(error);
}
});
或者,如果要排除的属性多于包含的属性,则可以专门选择要添加的属性,而不是要删除的属性:
const result = await User
.find({})
.select("email name");
答案 3 :(得分:0)
古老的问题,但我把2美分扔进了争执。...
您的问题已经被其他人正确回答,这只是我如何解决该问题的演示。
我用Object.entries()
+ Array.reduce()
来解决。这是我的看法:
// define dis-allowed keys and values
const disAllowedKeys = ['_id','__v','password'];
const disAllowedValues = [null, undefined, ''];
// our object, maybe a Mongoose model, or some API response
const someObject = {
_id: 132456789,
password: '$1$O3JMY.Tw$AdLnLjQ/5jXF9.MTp3gHv/',
name: 'John Edward',
age: 29,
favoriteFood: null
};
// use reduce to create a new object with everything EXCEPT our dis-allowed keys and values!
const withOnlyGoodValues = Object.entries(someObject).reduce((ourNewObject, pair) => {
const key = pair[0];
const value = pair[1];
if (
disAllowedKeys.includes(key) === false &&
disAllowedValues.includes(value) === false
){
ourNewObject[key] = value;
}
return ourNewObject;
}, {});
// what we get back...
// {
// name: 'John Edward',
// age: 29
// }
// do something with the new object!
server.sendToClient(withOnlyGoodValues);
一旦您了解了它的工作原理,就可以对其进行更多的清理,尤其是使用一些精美的ES6语法时。为了演示起见,我特意尝试使其更具可读性。
阅读有关Object.entries()
工作原理的文档:MDN - Object.entries()
阅读有关Array.reduce()
工作原理的文档:MDN - Array.reduce()
答案 4 :(得分:0)
除了调用toObject
之外的另一种解决方案是直接从猫鼬对象访问_doc
并使用ES6传播运算符删除不想要的属性,例如:
user = { ...user._doc, salt: undefined, pass: undefined }