我在将数据发送回浏览器之前尝试删除密钥。出于某种原因,也许是因为它是一个猫鼬对象,这不起作用:
delete myObject.property
如果我console.log(delete myObject.property)
我得到true
,我理解这意味着该属性未被删除。我该怎样摆脱这把钥匙?
(更多背景:我知道我可以通过使用mongoose select查询来关闭它,但我确实需要最初选择密钥。我也可以将它设置为null,这很好用,但我宁愿得到完全摆脱钥匙)
答案 0 :(得分:1)
首先将Mongoose文档对象转换为普通的Javascript对象:
const newObj = myObject.toObject();
delete newObj.property;
答案 1 :(得分:1)
正如MikaS所述,您需要转换为首先将Mongoose文档对象转换为普通对象:
const newObj = myObject.toObject();
delete newObj.property;
如果您这样做一次,这应该没问题。但是,如果你必须在任何地方重复这个逻辑,你返回这种类型的文档,省略某些键或其他转换,你应该在你的模式上定义转换:
// specify the transform schema option
if (!schema.options.toObject) schema.options.toObject = {};
schema.options.toObject.transform = function (doc, ret, options) {
// any kind of simple/complicated transformation logic here
// remove the _id of every document before returning the result
delete ret._id;
return ret;
}
// without the transformation in the schema
doc.toObject(); // { _id: 'anId', name: 'Wreck-it Ralph' }
// with the transformation
doc.toObject(); // { name: 'Wreck-it Ralph' }
答案 2 :(得分:0)
可以在某些版本中使用:
myObject.set('property_to_delete', undefined, {strict: false} );
myObject.save();
答案 3 :(得分:0)
使用lodash pickby方法。 文档:https://lodash.com/docs/#pickBy
答案 4 :(得分:0)
delete返回true。 所以你的密钥确实被删除了。您仍然可以看到密钥,因为在Mongoose文档实例中删除密钥时,它在原型链中可用。
尝试转换:
let Schema = new mongoose.Schema({
myProperty: String,
myOtherProperty: String
}, {
toObject: {
transform: function (doc, ret) {
delete ret.myOtherProperty;
}
},
toJSON: {
transform: function (doc, ret) {
delete ret.myOtherProperty;
}
}
});
答案 5 :(得分:0)
我为自己找到了解决方案,我只是在Schema上创建了一个小助手方法来删除可能的任何字段。
示例用户模式(简体):
const UserSchema = new Schema(
{
name: {
type: String,
required: true,
trim: true
},
email: {
type: String,
required: true,
trim: true,
},
password: {
type: String,
required: true,
trim: true
},
},
{
timestamps: true
}
);
const User = mongoose.model("User", UserSchema);
module.exports = User;
出于安全考虑,我喜欢在发送回客户端时从User对象中删除密码盐。我可能会在UserSchema
中创建一个辅助方法,例如:
UserSchema.methods.hidePasswordSalt = function() {
let self = this;
self = self.toObject();
if (self.password) {
delete self.password;
}
return self;
};
然后,在我的控制器等中,当我检索User
时,我调用该方法并发送结果:
User.findOne({ _id: req.session.userId })
.then(user => {
user = user.hidePasswordSalt(); // removes password field
return res.status(200).json(user);
})
.catch(error => {
return res.status(403).json(error.errors);
});