确保用户拥有更新文档的最有效方法?

时间:2014-11-29 03:32:40

标签: meteor

我使用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});
  }

});

1 个答案:

答案 0 :(得分:3)

您不需要额外的数据库调用来获取原始文档,只需在userId选择器中添加update附加条件即可。如果没有正确_iduserId的文档,则不会进行更新。 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}}