从流星方法内部调用时,this.userId()通常为null

时间:2012-06-24 18:22:13

标签: meteor

我最近开始尝试meteor的auth分支,并根据我调用调用this.userId()的meteor方法,它将返回null或我需要的用户ID。

更具体一点,当我从meteor.startup内部初始化的coffeescript类调用meteor方法时,它可以正常工作,但不是从Meteor.publish内部调用相同方法时。

流星方法很简单,可能不相关,但以防万一:

Meteor.methods(
  get_user_id: ->
    return @userId()
)
编辑:似乎人们无法重现我的问题,这里是todo auth示例的补丁,应该证明它。

    diff --git a/examples/todos/server/methods.js b/examples/todos/server/methods.js
    index e69de29..d4182a6 100644
    --- a/examples/todos/server/methods.js
    +++ b/examples/todos/server/methods.js
    @@ -0,0 +1,6 @@
    +Meteor.methods({
    +  get_user_id: function() {
    +    console.log(this.userId());
    +    return this.userId();
    +  }
    +});
    diff --git a/examples/todos/server/publish.js b/examples/todos/server/publish.js
    index 1552c5e..87cb29f 100644
    --- a/examples/todos/server/publish.js
    +++ b/examples/todos/server/publish.js
    @@ -16,6 +16,8 @@ Todos = new Meteor.Collection("todos");

     // Publish visible items for requested list_id.
     Meteor.publish('todos', function (list_id) {
    +  Meteor.call('get_user_id');
    +  //console.log(this.userId())
       return Todos.find({
         list_id: list_id,
         privateTo: {

感谢Eitan补丁!

4 个答案:

答案 0 :(得分:3)

您应该使用Meteor.userId()Meteor.methods中检索当前用户的ID。 :)

答案 1 :(得分:1)

这可能是愚蠢的:但是,你是否登录?(抱歉,这最终是我的问题。)


如果登录,最好先检查一下:

if (this.userId)
    console.log(this.userId)

答案 2 :(得分:0)

就我所知,

this.userId()本身并不是被动的,所以如果你想让其他事情做出反应,你需要将它放在Session变量中。所以,从Meteor.startup开始:

Session.set('userId', this.userId());

然后,在您需要的地方,您可以使用它:

Session.Get('userId');

这样,当它丢失时,null将在稍后填写。

答案 3 :(得分:0)

这对我有用。您确定正确获得Meteor.call的返回值吗?类似的东西:

Meteor.call 'get_user_id', (error, result) -> console.log(result)

如果在方法中添加console.log(@userId())会怎样?