无法在Meteor.methods中设置正确的编辑权限



我试图通过我的流星方法设置添加,编辑和删除的权限。我正在制作一个日历,用户可以向其中添加事件,并且所有人都可以看到事件,但是事件只能由事件所有者更新或删除。

到目前为止,我有它,只有登录的用户可以插入项目,当它插入一个createdBy:currentUserId值被分配,但在一个项目被插入后,我希望它被设置到只有创建事件的用户可以更新或删除它。这应该来自创建项目时存储的createdBy

我已经通读了文档,但仍然不能让这个工作。在我的方法中,我一直在使用var currentUserId = Meteor.userId();设置变量,并且我一直试图通过使用if({createdBy: currentUserId}) {allow edit and delete here}

的方法限制编辑和删除。

到目前为止,我所做的一切都不能阻止其他用户删除或编辑其他用户的事件。

我只发布与编辑相关的代码,因为我假设编辑和删除几乎相同。我是非常新的流星,所以任何和所有的帮助是赞赏!

更新!我正试图将我的createdBy切换到我的方法,如@Yann推荐,但它不允许用户ID被放置,只是返回createdBy的错误是必需的。我正在尝试的代码是

Meteor.methods({
  addEvent( event ) {
    var currentUserId = Meteor.userId();
    var createdBy = currentUserId;
    check( event, {
      title: String,
      start: String,
      end: String,
      type: String,
      guests: Number
    });
    try {
      return Events.insert( event, {
        $set: createdBy
      });
    } catch ( exception ) {
      throw new Meteor.Error( '500', `${ exception }` );
    }
  }
});

UPDATE结束

添加编辑模式代码

Template.addEditEventModal.events({
  'submit form' ( event, template ) {
    event.preventDefault();
    var currentUserId = Meteor.userId();

    let eventModal = Session.get( 'eventModal' ),
        submitType = eventModal.type === 'edit' ? 'editEvent' : 'addEvent',
        eventItem  = {
           createdBy: currentUserId,
          title: template.find( '[name="title"]' ).value,
          start: template.find( '[name="start"]' ).value,
          end: template.find( '[name="end"]' ).value,
          type: template.find( '[name="type"] option:selected' ).value,
          guests: parseInt( template.find( '[name="guests"]' ).value, 10 )
        };
    if ( submitType === 'editEvent' ) {
      eventItem._id   = eventModal.event;
    }
    Meteor.call( submitType, eventItem, ( error ) => {
      if ( error ) {
        Bert.alert( error.reason, 'danger' );
      } else {
        Bert.alert( `Event ${ eventModal.type }ed!`, 'success' );
        closeModal();
      }
    });
  },
   'click .delete-event' ( event, template ) {
    let eventModal = Session.get( 'eventModal' );
    if ( confirm( 'Are you sure? This is permanent.' ) ) {
      Meteor.call( 'removeEvent', eventModal.event, ( error ) => {
        if ( error ) {
          Bert.alert( error.reason, 'danger' );
        } else {
          Bert.alert( 'Event deleted!', 'success' );
          closeModal();
        }
      });
    }
  }
});

更新方法

Meteor.methods({
  editEvent( event ) {
    check( event, {
      _id: String,
      createdBy: String,
      title: Match.Optional( String ),
      start: String,
      end: String,
      type: Match.Optional( String ),
      guests: Match.Optional( Number )
    });
    var currentUserId = Meteor.userId();
  if({createdBy: currentUserId}){
    try {
      return Events.update( event._id, {
        $set: event
      });
    } catch ( exception ) {
      throw new Meteor.Error( '500', `${ exception }` );
    }
  }
}
});

你的代码中有几个错误:

首先,Events.insert( event, {$set: createdBy })没有意义。您正在尝试在插入的同时执行$set,而您的createdBy只是一个字符串。

试题:

Meteor.methods({
  addEvent( event ) {
    check( event, {    
      title: String,
      start: String,
      end: String,
      type: String,
      guests: Number
    });
    try {
      event.createdBy = Meteor.userId();
      return Events.insert(event);
    } catch ( exception ) {
      throw new Meteor.Error( '500', `${ exception }` );
    }
  }
});

后来在你更新的方法中,你有if({createdBy: currentUserId}),这也没有意义,因为它总是评估为真(你基本上写if(object)。使用:

if( event.createdBy === Meteor.userId() )

请注意,允许/拒绝规则不适用于服务器方法

去检查允许机制来设置插入、更新和删除的允许规则。https://docs.meteor.com/api/collections.html Mongo-Collection-allow

Regs

相关内容

  • 没有找到相关文章

最新更新