0

Я пытаюсь установить разрешения для добавления, редактирования и удаления с помощью моих методов Meteor. Я работаю над календарем, который пользователи могут добавлять к событиям, и там события видны всем, но событие может быть обновлено или удалено только владельцем события.Невозможно установить правильные разрешения на редактирование в Meteor.methods

До сих пор у меня есть то место, где только зарегистрированные пользователи могут вставлять элементы, а когда оно вставлено, назначается значение createdBy:currentUserId, но после того, как элемент вставлен, я хочу, чтобы он был настроен там, где только пользователь, создавший событие может обновить или удалить его. Это должно исходить из значения createdBy, которое сохраняется при создании элемента.

Я прочитал документацию, но все еще не могу заставить это работать. В моих методах я установка вара с var currentUserId = Meteor.userId(); и я пытался ограничить редактирование и удаление с помощью метода с if({createdBy: currentUserId}) {allow edit and delete here}

Все, что я пытался до сих пор не мешаю другим пользователей удалять или редактировать другие пользователи события.

Я только размещаю код, относящийся к редактированию, поскольку я предполагаю, что редактирование и удаление будут почти идентичными. Я очень новичок в Метеор, поэтому всякая помощь приветствуется!

ОБНОВЛЕНИЕ! Я пытаюсь переключить свой createdBy на мой метод, например, @Yann, но он не позволит размещать идентификатор пользователя и просто возвращает ошибку 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 }`); 
    } 
    } 
} 
}); 

ответ

0

Есть несколько ошибок в коде:

Во-первых, Events.insert(event, {$set: createdBy }) не имеет смысла. Вы пытаетесь сделать $set одновременно с вставкой, а ваш createdBy - это просто строка.

Try:.

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()) 

Обратите внимание, что правила allow/deny делают не относятся к методам сервера.

+0

Спасибо за советы по вводу этого идентификатора пользователя! Один вопрос я изменил свой метод обновления, чтобы использовать 'if (event.createdBy === currentUserId)', но кажется, что он не может получить идентификатор текущего пользователя. Любая идея о том, что может пойти не так? Благодаря! –

+0

Должно быть только 'Meteor.userId()', как показано выше. –

+0

Просто попробовал 'if (event.createdBy === Meteor.userId())' и все равно ничего console.log в операторе if также ничего не возвращает. Может ли быть что-то, что мешает ему получить userId? –

0

Go проверить механизм позволяет установить вы разрешаете правила для вставки, обновления и удаления. https://docs.meteor.com/api/collections.html#Mongo-Collection-allow

Regs

+0

Будет ли проблема с этим ? Это не то, что редактирование не может быть сделано, моя проблема в том, что когда я устанавливаю разрешения, он по-прежнему позволяет любому зарегистрированному пользователю вносить изменения. Единственное, что до сих пор блокирует, - это выходить из системы. –

+0

Мог ли я использовать неправильный код для установки этих разрешений? –

+0

Измените свой оператор if на event.createdBy === Meteor.userId() – Yann

 Смежные вопросы

  • Нет связанных вопросов^_^