我使用Meteor方法更新文档,这样我就可以更轻松地分享它们并获得更多控制权。但是我在检查所有权方面遇到了问题。
我应该如何检查以确保调用更新方法的用户是文档的所有者?目前我首先抓取文档然后运行更新。
有没有更好的模式来实现这一目标?
Meteor.methods({
'Listing.update': function(docId, data) {
var doc = db.listings.findOne({_id: docId}) || {};
if (doc.userId !== this.userId) {
throw new Meteor.Error(504, "You don't own post");
}
// ensure data is the type we expect
check(data, {
title: String,
desc: String
});
return db.listings.update(docId, {$set: data});
}
});
答案 0 :(得分:3)
您不需要额外的数据库调用来获取原始文档,只需在userId
选择器中添加update
附加条件即可。如果没有正确_id
和userId
的文档,则不会进行更新。 update
返回更新的文档数,因此成功时返回1,失败时返回0。
'Listing.update': function(docId, data) {
var self = this;
check(data, {
title: String,
desc: String
});
if ( ! self.userId )
throw new Meteor.Error(500, 'Must be logged in to update listing');
res = db.listings.update({_id: docId, userId: self.userId}, {$set: data});
if ( res === 0 )
throw new Meteor.Error( 504, "You do not own a post with that id" );
return res;
}
此外,如果使用findOne
检查文档是否存在,请使用fields选项限制从db返回的内容。通常只是{fields: {_id:1}}
。