所以我这里有这个代码用于自动订阅当前的玩家游戏
Deps.autorun ->
Meteor.subscribe "game", Meteor.user().profile.game
但它只适用于谷歌浏览器。 firefox和IE都显示错误,说明Meteor.user(...)未定义。
请注意,当我直接在控制台中输入Meteor.user().profile.game
时,它会很好地返回当前游戏ID。显然,问题仅在于上述代码出于某种原因。另外,依赖于Session的其他Deps.autorun函数也可以正常工作。
感谢。
答案 0 :(得分:4)
这是竞争条件。您假设用户已在autorun
执行时登录。如果他/她不是,则Meteor.user()
将返回null
。一种解决方案是使用浸泡:
Tracker.autorun ->
Meteor.subscribe 'game', Meteor.user()?.profile.game
但是发布函数知道哪个用户试图订阅,所以我认为更好的解决方案是这样的:
Tracker.autorun ->
if Meteor.user()
Meteor.subscribe 'game'
请注意,Meteor.user()
中的autorun
检查会在用户登录时强制重新运行(这也是出于性能原因)。然后在服务器上执行:
Meteor.publish 'game', ->
user = Meteor.users.findOne @userId
{game} = user.profile
Games.find game