Meteor的拒绝/允许回调从哪里接收其参数内容?

时间:2014-08-20 16:43:00

标签: meteor

我正在浏览显微镜书(再次),我试图找出Allow和Deny回调从哪里获取参数。

收藏夹文件夹中的

posts.js:

Posts = new Meteor.Collection('posts');

Posts.allow({
    update: ownsDocument,
    remove: ownsDocument
});

Posts.deny({
    update: function(userId, post, fieldNames){
        return (_.without(fieldNames, 'url', 'title').length > 0);
    }
});
lib文件夹中的

permissions.js

ownsDocument = function(userId, doc){
    return doc && doc.userId === userId;
}

假设用户调用

Posts.update("postID234232", {objectTo: insert}, function(){//callback} );
然后运行

Posts.allowPosts.deny

  1. ownsDocument函数从哪里获取userIddoc参数的内容?

  2. update中的Posts.deny键从哪里获取userIdpostfieldNames的内容?

2 个答案:

答案 0 :(得分:3)

  

1)ownsDocument函数在哪里获取userId的内容   来自?

的doc参数

userId在客户端和服务器上通过Meteor.userId()在meteor中全局可用,因此当前连接的用户希望对ownsDocument执行CRUD操作采集。为方便起见,传递了此参数,因为在allow/deny回调中,可以使用Meteor.userId()来访问当前用户。

doc参数是受插入/更新/删除影响的文档,您必须记住,在集合CRUD操作中执行允许/拒绝回调规则,以便我们可以访问客户端正在尝试的实际文档修改。

  

2)Posts.deny中的更新密钥在哪里获取内容   来自?

的userId,post和fieldNames

当客户端调用Collection.update时,会传递一个名为mongo修饰符对象的对象,该对象允许您指定要修改的集合中的哪些字段。 fieldNames参数包含客户端愿意修改的顶级字段名称,以此更新调用为例:

Posts.update(postId,{
  $set:{
    title:"New title !"
  }
});

更新方法会将"title"提取为客户端想要修改的顶级字段,并将其传递给允许/拒绝规则。

以下是Meteor.Collection的更新方法可以用来计算传递给允许/拒绝规则的参数的伪代码,这不是实际的流星代码,仅作为解释提供。

Meteor.Collection.prototype.update = function(selector, modifier, ...){
  // get a cursor of documents that should be impacted by the update
  var impactedDocuments = this.find(selector);
  // extract top-level fields names from the modifer [1]
  var fieldNames = _.keys(modifier.$set);
  // iterate over impacted documents
  impactedDocuments.forEach(function(impactedDocument){
    // iterate over "validators" (Meteor internal name for allow/deny rules)
    _.each(this._validators.update.allow, function(updateAllowRule){
      // call the allow rule with computed parameters
      updateAllowRule(Meteor.userId(), impactedDocument, fieldNames);
    });
  });
}

通过

定义允许规则时
Collection.allow({
  update:function(userId, doc, fieldNames, modifier){
    // ...
  }
});

Meteor将此功能附加到Collection._validators.allow.update

[1] http://underscorejs.org/#keys

答案 1 :(得分:1)

好的,所以经过一些阅读后,看来Meteor会自动将userIddoc参数传递给分配给传递给updateremove键的任何函数对象允许或否认。

所以,一个非常重要的外卖(我认为):

'用户id'和' doc'必须按照这个特定的顺序。我可以将ownsDocument重写为以下内容:

ownsDocument = function(theCurrentUsersId, document){
    return document && document.theCurrentUsersId === theCurrentUsersId;
}

但用户的ID必须在文档之前。

我无法做到:

ownsDocument = function(document, theCurrentUsersId){
    return document && document.theCurrentUsersId === theCurrentUsersId;
}