Meteor.js如何在onStop事件中获取userId?

时间:2016-08-09 06:42:02

标签: javascript meteor

我在meteor.js服务器上运行:

Meteor.publish('games', function(){

    this.onStop(function() {
        Meteor.call('leaveQueue');
    });

    return Games.find({ player: this.userId })
});

当用户停止订阅时,它会调用methods.js上的此函数:

Meteor.methods({

    leaveQueue:function(){
        console.log(this.userId);
    }

});

它将null记录为userId .. 现在,如果我在控制台上使用Meteor.call('leaveQueue')从前端调用它,它会正确记录用户ID。

我甚至尝试过console.log(Meteor.userId)和console.log(Meteor.userId()),全部为空。

可能会发生什么?

1 个答案:

答案 0 :(得分:0)

Meteor允许您从服务器端的另一个方法调用Method,并维护正确的上下文(因此userIdconnection等都取自原始方法调用)。但是,从发布函数调用Method时不是这种情况。当您在出版物中创建Meteor.call时,被叫方法会尝试从当前DDP连接中提取userId详细信息(通过查看内部DDP._CurrentInvocation)。这些详细信息不存在,因此被调用的方法无法保留它们(有关详细信息,请参阅ddp-server/livedata_server.js源)。

话虽如此,您可以在出版物的userId回调中获得当前onStop

Meteor.publish('games', function games() {
  this.onStop(() => {
    // This will log the proper userId
    console.log(this.userId);
  });
  return Games.find({ player: this.userId })
});

我建议通过调用实用程序函数而不是Meteor方法,在userId回调中使用onStop运行您的方法代码。如果要避免重复代码,可以将Method的公共代码提取到实用程序函数中,并在两个位置使用它。例如:

// Stored in a utility file somewhere
function doSomethingCommon(userId) {
  // Do something ...
}

Meteor.methods({
  leaveQueue() {
    doSomethingCommon(Meteor.userId());
  }
});

Meteor.publish('games', function games() {
  this.onStop(() => {
    doSomethingCommon(this.userId);
  });
  return Games.find({ player: this.userId })
});