4

我正在使用带有 express 和 node 的猫鼬来创建 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);
  });

有没有更有效的方法?我不喜欢这样,因为如果随后添加了一个字段,则必须有人记得专门删除它。此外,出于性能原因,我也不想“重新选择”该字段。

4

2 回答 2

12

您可以添加一个方法,getPublicFields该方法返回一个严格包含公共字段的对象。

orgSchema.methods.getPublicFields = function () {
    var returnObject = {
        name: this.name,
        address: this.address,
        randomField: this.randomField
    };
    return returnObject;
};

如果您愿意,您还可以向该函数添加回调并执行一些其他查询来聚合数据。方法完成后,调用

var orgPublic = org.getPublicFields();
于 2013-01-07T13:06:32.843 回答
0

如果有人仍然对更猫鼬友好的答案感兴趣,请参阅以下内容。

当您使用时,.select(...)您可以看到 mongoose 文档仍然具有其所有字段,并且该_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);

    }
}
于 2017-08-01T08:46:15.047 回答