我定义了一个类似
的架构var UserSchema = new Schema({
firstName: { type: String, required: true },
lastName: { type: String, required: true },
email: { type: String, required: true },
location: { type: String, required: true },
picture: { type: String, required: true },
passwordHash: { type: String, required: true },
resetPasswordToken: String,
resetPasswordExpired: Boolean
});
我有一个REST端点,它返回所有用户的列表。在该列表中,我想隐藏一些属性,即passwordHash, resetPasswordToken, resetPasswordExpired
我定义了一个自定义过滤器功能,如下所示
var doFilterUser = function(user) {
_.omit(user, ['passwordHash', 'resetPasswordToken', 'resetPasswordExpired']);
user.id = user._id;
delete user._id;
delete user.__v;
return user;
};
_
是lodash
当我检查我的API是否正在响应所有用户属性
此过滤器函数在公共帮助程序模块中定义,我将其称为
User.findOne({_id: id}, function(err, user) {
var filtered = helper.doFilterUser(user);
});
如何解决此问题?
答案 0 :(得分:5)
试试这个: 您可以通过mongoose访问某些值。
User.findOne({_id: id}, 'firstName lastName email location picture', function(err, user){
console.log(user);
});
您只需在查询后提及所需的字段。
希望它有所帮助......
答案 1 :(得分:2)
这里的问题是你仍然有一个符合严格模式的mongoose文档。如果要更改该文档,则需要将其设为“原始”对象,而不使用所有其他控件:
User.findOne({_id: id}, function(err, user) {
var filtered = helper.doFilterUser(user.toObject());
});
因此这里的.toObject()
方法将以原始形式返回一个对象。这允许您按照自己的意愿操纵键。
答案 2 :(得分:2)
您还可以明确指示它不要回送某些属性。如果您不想通过网络呈现哈希密码,则非常有用。 find方法如下所示:
User.find({}, '-id -__v',function(err,users){
})
或
User.findOne({_id: id}, '-id -__v',function(err,user){
})