我试图通过我的流星方法设置添加,编辑和删除的权限。我正在制作一个日历,用户可以向其中添加事件,并且所有人都可以看到事件,但是事件只能由事件所有者更新或删除。
到目前为止,我有它,只有登录的用户可以插入项目,当它插入一个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