流星注销不在选项卡之间同步

Meteor log out do not sync between tabs

我正在将 Meteor 与 React 结合使用,但在注销功能上遇到了问题。当我在同一个浏览器上打开 2 个以上的选项卡时,如果我从一个选项卡注销,那么其他打开的选项卡将不会注销,但如果我使用它就会挂起。只有两种退出方式:关闭选项卡或刷新它。

我对登录功能进行了同样的尝试并且成功了,登录状态在所有打开的选项卡之间同步。

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

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

感谢您的帮助。

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

meteor documentation 开始,您可以在调用 Meteor.logout() 之前使用 Meteor.logoutOtherClients()

普通(如在非隐身模式下)浏览器选项卡共享相同的会话恢复令牌。当关联会话的用户状态发生变化时,Meteor 服务器将更新它们。

可以使用 2 个响应式调用来响应式跟踪登录状态:

  • Meteor.userId() - return 用户的 ID 或如果没有用户登录则为 null。
  • Meteor.loggingIn() - return如果用户当前处于登录的瞬时状态则为真,否则为假。

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

您可以通过 运行 在连接到同一 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');
  }
});

尝试从其中一个选项卡登录和注销,然后观看另一个选项卡。

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

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

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

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