Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Permissions Meteor允许更新:I';“我试图让任何用户”;加入;帖子,但只有帖子创建者才能编辑帖子?_Permissions_Meteor - Fatal编程技术网

Permissions Meteor允许更新:I';“我试图让任何用户”;加入;帖子,但只有帖子创建者才能编辑帖子?

Permissions Meteor允许更新:I';“我试图让任何用户”;加入;帖子,但只有帖子创建者才能编辑帖子?,permissions,meteor,Permissions,Meteor,因此,我正在尝试构建一个类似于Meteor主页上Parties示例的应用程序。在Parties应用程序中,您可以创建一个派对,邀请他人参加,或将其公开。我想做的是改变它,这样即使它是一个公共聚会,你仍然必须通过点击一个按钮来加入它 除了通过console.logs,我发现这是不允许的,因为单击“加入”按钮的用户正在尝试更新事件,但当前只有事件开始才能访问更新 所以这是正确的 var currentUser = Meteor.userId(); var currentEventId = t

因此,我正在尝试构建一个类似于Meteor主页上Parties示例的应用程序。在Parties应用程序中,您可以创建一个派对,邀请他人参加,或将其公开。我想做的是改变它,这样即使它是一个公共聚会,你仍然必须通过点击一个按钮来加入它

除了通过console.logs,我发现这是不允许的,因为单击“加入”按钮的用户正在尝试更新事件,但当前只有事件开始才能访问更新

所以这是正确的

var currentUser = Meteor.userId();
    var currentEventId = this._id;

    Events.update(currentEventId, {$addToSet: { attendees: currentUser }}, function(error) {
        console.log(error);
        if (error) {
            throwError(error.reason);
        } else {
            Router.go('eventPage', {_id: currentEventId});
        }
但现在我需要改变这一切

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

ownsDocument = function(userId, doc) {
    return doc && doc.userId === userId;
}
因此,我认为我需要更改更新,比如:


如果您不是用户,则需要加入或登录。如果您是用户但不是活动创建者,则可以将您的用户ID添加到Attendeers数组中。如果您是事件创建者,则可以编辑事件。我真的不知道在allow update函数中是否允许这样做,或者如何编写它,因为我还是JS的新手。谢谢你的帮助

首先,确保从
.meteor/packages
中删除不安全的

我建议只执行基本的
允许
/
拒绝
规则。例如,所有者可以更新某些字段

对于稍微复杂一点的问题,请使用Meteor.methods
。方法将忽略允许和拒绝规则,并允许您执行更复杂的操作

方法总是在服务器端执行/确认,并且可以选择在客户端上进行“模拟”,使其看起来好像是立即执行的

例如,将当前登录的用户添加到事件的方法-

Meteor.methods({
  'attendEvent': function(eventId){
    // check they're logged in
    check(this.userId, String);
    // check the eventId isn't something un-expected
    check(eventId, String);
    // add the user to `attendees`, using `$addToSet` as each user can only attend once
    Events.update({_id: eventId}, {$addToSet: { attendees: this.userId}});
  }
});
然后,您可以调用客户端上的操作,如:

Template.myTemplate.events({
   'click a[data-action="attendEvent"][data-event]': function(e){
      // get the eventId from element data- however data could be available in this.eventId / this._id too!
      var eventId = $(e.currentTarget).data('event')
      Meteor.call('attendEvent', eventId)
    }
});

您可以修改
allow()
函数以匹配所需的逻辑。将您的
更新:
更改为:

update: function( userId, doc, fields, modifier ){
   return ( doc &&  doc.userId === userId ) || ( userId && modifier === {$addToSet: { attendees: userId}} );
},

在调用'Events.update()之前,您可能还想添加一个
if
来检查客户端上的
currentUser
,因为它将失败

谢谢。这很有道理。因此,保留我当前的allow和deny,只添加这个方法。如果这种方法发生了,那么它甚至不需要检查允许/拒绝,否则只有事件所有者可以修改内容?这也非常简洁地回答了这个问题,但我最终从另一个答案中学到了一些额外的东西。我希望我能给你们两个想象中的因果报应,但我甚至没有代表给任何。