mongoose文件过滤属性

我已经定义了一个模式

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

我定义了如下的自定义filter函数

 var doFilterUser = function(user) { _.omit(user, ['passwordHash', 'resetPasswordToken', 'resetPasswordExpired']); user.id = user._id; delete user._id; delete user.__v; return user; }; 

_是lodash

当我检查我的API是响应与所有用户属性

这个filter函数是在通用的帮助器模块中定义的,我称之为

 User.findOne({_id: id}, function(err, user) { var filtered = helper.doFilterUser(user); }); 

如何解决这个问题?

这里的问题是,你仍然有一个符合严格模式的mongoose文件。 如果你想改变那个文档,那么你需要把它变成一个“原始的”对象而没有所有的附加控制:

 User.findOne({_id: id}, function(err, user) { var filtered = helper.doFilterUser(user.toObject()); }); 

所以这里的.toObject()方法将以原始forms返回一个对象。 这允许你操纵你想要的键。

试试这个:你可以通过mongoose访问某些值。

 User.findOne({_id: id}, 'firstName lastName email location picture', function(err, user){ console.log(user); 

});

在查询之后,您只需提到所需的字段。

希望能帮助到你….

您也可以明确指示它不要回送某些属性。 如果您不想通过电线呈现散列密码,则可用。 find方法如下所示:

 User.find({}, '-id -__v',function(err,users){ }) 

要么

 User.findOne({_id: id}, '-id -__v',function(err,user){ })