我在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()),全部为空。
可能会发生什么?
答案 0 :(得分:0)
Meteor允许您从服务器端的另一个方法调用Method,并维护正确的上下文(因此userId
,connection
等都取自原始方法调用)。但是,从发布函数调用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 })
});