【问题标题】:Meteor: Filtering properties on insert doesn't workMeteor:插入时过滤属性不起作用
【发布时间】:2014-06-17 04:37:52
【问题描述】:

我想过滤来自客户端但在创建新文档时不需要的属性。我尝试使用下划线的 _.pick() 但似乎我无法覆盖 doc

Meteor.Collection.prototype.addTimestamps = function () {

  this.deny({
    insert: function(userId, doc) {
      doc.createdAt = Date.now();
      doc.updatedAt = Date.now();
      return false;
    },
    update: function(userId, doc, fieldNames, modifier) {
      modifier.$set.updatedAt = Date.now();
      return false;
    },
  });

};


Entries.addTimestamps();
Entries.allowed = ['_id', 'content', 'createdAt', 'updatedAt'];

Entries.allow({
  insert: function (userId, doc) {
    doc = _(doc).pick(Entries.allowed);
    doc.userId = userId;
    return !! userId;
  },

  update: function (userId, doc, fieldNames, modifier) {
    return doc.userId === userId;
  },

  remove: function (userId, doc) {
    return doc.userId === userId;
  }
});

【问题讨论】:

  • 可以让这种事情发挥作用,但我建议改用一种方法。这只是我的观点,但在允许回调中操作文档似乎令人困惑。

标签: javascript collections meteor


【解决方案1】:

写信给doc

doc = _(doc).pick(Entries.allowed);

您将覆盖doc 变量,使其不再指向实际的doc 对象。你想要的是改变 object 本身。

您需要delete 所有未列入白名单的doc 属性。示例实现:

insert: function(userId, doc) {
  var keys = _.keys(doc);
  keys = _.difference(keys, Entries.allowed);
  _.each(keys, function(key) {
    delete doc[key];
  });
}

【讨论】:

    猜你喜欢
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2021-05-21
    • 2021-05-20
    相关资源
    最近更新 更多