4

我正在通过一本书来学习 Meteor,现在我们想要insert()userId是当前登录的用户。

Template.categories.events({

    'keyup #add-category': function(e, t) {
        if(e.which == 13) {
          var catVal = String(e.target.value || "");
          if(catVal) {
            lists.insert({Category: catVal, owner: this.userId});
            console.log(this.userId);
            Session.set('adding_category',false);
          }
        }
    },

但是this.userId未定义,因此insert()没有按预期工作。让这个工作缺少什么?

它以某种方式在下面的代码中工作(userId已定义):

lists.allow({
    insert: function(userId, doc) {
      return adminUser(userId);
    },
    update: function(userId, docs, fields, modifier) {
      return adminUser(userId);
    },
    remove: function(userId, docs) {
      return adminUser(userId);
    }
});

更新

为什么在服务器端this.userId有效但无效Meteor.userId()

Meteor.publish("Categories", function() {
    return lists.find({owner:this.userId}, {fields:{Category:1}});
});
4

5 回答 5

8

你应该在任何地方使用 Meteor.userId() 除了发布函数,只有在发布函数内部你必须使用 this.userId。

this.userId 仅在服务器上可用。在您的方法中,由于延迟补偿,客户端可以访问并且需要模拟服务器将执行的操作,因此如果您在 Meteor.call 中使用 this.userId ,则客户端在运行它们时将失败。

客户端无法通过 this.userId 访问 userId,但客户端和服务器(发布功能除外)都可以通过 Meteor.userId() 访问当前的 userId。

希望这可以澄清它。我花了很长时间才弄清楚这一点。

顺便说一句,我知道这是对旧帖子的回应,但我很难找到答案,希望这能帮助将来经历同样事情的人。

于 2015-02-19T16:14:51.707 回答
4

你应该Meteor.userId()改用。

于 2013-07-24T00:31:45.713 回答
3

对于更新问题: Meteor.userId 只能在方法调用中调用。在发布函数中使用 this.userId。

于 2013-12-26T07:45:54.703 回答
1

根据我的经验,this.userId在仅限服务器的方法调用发布函数上使用以避免错误。另一方面,Meteor.userId()在涉及客户端时使用(除了发布功能的任何地方)。

于 2015-05-02T09:48:54.927 回答
0

this.userId仅在服务器上可用。运行时流星用户节点光纤,您可以访问环境属性。当你使用 NPM 包时,假设是 Stripe,并且你想设置一个回调,你必须使用 Meteor.bindEnvironment()。文档对此并没有太多表现力:http: //docs.meteor.com/#/full/timers。还要检查这个问题:Meteor 和 Fibers/bindEnvironment() 发生了什么?

在服务器上,您的代码必须在光纤内运行。

在客户端上,您没有在光纤内运行代码,这this.userId就是不可用的原因。

于 2015-05-03T08:14:00.713 回答