我正在使用带有express和node的mongoose来创建REST API。保存新对象后,我想将对象返回给用户。但是,不要返回一些敏感字段,如密码,信用卡详细信息,权限,帐单历史记录等。
我认为会有相当于.select的地方,您可以只选择一个字段子集返回给用户。但是,它似乎不存在,“标准”只是删除您不想传递给用户的字段,如下所示:
org.save(function(err, org) {
if (err) return handleError(err, res);
orgobj = org.toObject();
delete orgobj.__v;
delete orgobj._id;
delete orgobj.billing;
delete orgobj.plans;
delete orgobj.permissions;
return res.send(orgobj);
});
有更有效的方法吗?我不喜欢这个,因为如果随后添加了一个字段,有人必须记住要专门删除它。另外,出于性能原因,我也不想“重新选择”该字段。
答案 0 :(得分:7)
您可以添加一个方法getPublicFields
,该方法返回一个严格包含公共字段的对象。
orgSchema.methods.getPublicFields = function () {
var returnObject = {
name: this.name,
address: this.address,
randomField: this.randomField
};
return returnObject;
};
如果您希望这样做,您还可以向该函数添加回调并执行一些其他查询来聚合数据。方法完成后,只需调用
即可var orgPublic = org.getPublicFields();
答案 1 :(得分:0)
如果有人仍然对更友好的mongoose答案感兴趣,请参阅以下内容。
当您使用.select(...)
时,您可以看到mongoose doc仍然包含其所有字段,而_doc
属性是要减少的属性。
您可以执行的操作是在保存新文档后从newDoc['_doc']
中删除您想要的字段。
现在,您可以使用newDoc.toObject()
来吸引公众"你指定的字段。
在下面的示例中,我使用_.pick()
创建了我想要的字段的白名单,但您也可以使用_.remove()
创建黑名单。
请注意publicFileds
数组可以在.select(...)
中用于查询,因此您只需要一个publicFileds
定义CRUD操作。
var MyModel = require('./MyModel');
var _ = require('lodash');
var publicFileds = ['_id', 'name', 'age'];
function create(newModelData, cb) {
var newModle = new MyModel(newModelData);
newModle.save(function (err, newDoc) {
if (err) {
cb(err);
return;
}
newDoc['_doc'] = _.pick(newDoc['_doc'], publicFileds);
cb(null, newDoc);
}
}