Meteor注销不会在选项卡之间同步

时间:2016-02-23 17:18:35

标签: javascript meteor reactjs meteor-accounts

我正在使用Meteor和React,并且在注销功能方面遇到了问题。当我在同一个浏览器上打开两个以上的选项卡时,如果我从一个选项卡中注销,那么其他打开的选项卡将不会被注销,但如果我使用它将会挂起。注销只有两种方法:关闭标签或刷新标签。

我尝试使用相同的登录功能并且工作正常,登录状态会在所有打开的标签页之间同步。

我当前调用注销功能的代码:

signOut: function(event) {
    event.preventDefault();
    Meteor.logout();
    this.props.history.pushState(null, "/");
},

感谢帮助。

更新 我检查了websocket,似乎服务器确实发送了注销状态,但我的客户端代码没有调用注销方法(或者它是挂起)。然后挂起选项卡中的每个数据仍然存在。但我不知道如何进一步检查。

3 个答案:

答案 0 :(得分:1)

我找到了原因。这是因为如果用户没有登录,我会尽量避免在Meteor.publish()上发送数据。问题是我不会在这种情况下返回任何内容。 当用户没有像这样登录时,我的解决方案是返回this.ready()

Meteor.publish("myCollections", function (){
    if (!this.userId) return this.ready();

    return MyCollections.find({owner: this.userId});
});

答案 1 :(得分:0)

meteor documentation之后,您可以在致电Meteor.logoutOtherClients()之前使用Meteor.logout()

答案 2 :(得分:-1)

正常(如非隐身)浏览器标签共享同一会话恢复令牌。当关联会话的用户状态发生变化时,Meteor服务器将全部更新它们。

可以使用2个无效呼叫来反应跟踪登录状态:

  • Meteor.userId() - 返回用户的ID,如果没有用户登录,则返回null。
  • Meteor.loggingIn() - 如果用户当前处于登录状态,则返回true,否则返回false。

状态可能需要几秒钟才能更新标签,但最终会发生。您可以自行检测这些变化并对其采取行动。

您可以通过在连接到同一Meteor服务器的2个打开的标签的控制台中运行以下反应代码来轻松测试:

Tracker.autorun(function() {
  if (Meteor.loggingIn()) {
    console.info('logging in');
  } else if (Meteor.userId()) {
    console.info('logged in');
  } else {
    console.info('logged out');
  }
});

尝试登录并从其中一个标签中注销,然后观看另一个标签。

使用此技术,您可以跟踪登录状态并更改应用程序状态,并在登录状态更改时执行相应操作(例如,重定向/呈现不同的视图或布局)。