【问题标题】:Meteor log out do not sync between tabsMeteor 注销不会在选项卡之间同步
【发布时间】:2016-02-23 17:18:34
【问题描述】:

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

我尝试了相同的登录功能,它成功了,登录状态在所有打开的选项卡之间同步。

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

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

感谢您的帮助。

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

【问题讨论】:

  • 其他标签不应该也不应该调用logout()方法。它只是更改了响应式Meteor.userId() 属性。在userId()null 时,是否检查向用户传递数据的发布中的 userId 并避免发送数据?
  • 感谢@MasterAM。我找到了解决方案。

标签: javascript meteor reactjs meteor-accounts


【解决方案1】:

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

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

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

【讨论】:

  • 这是一个相当常见的 Meteor 成语。但是,虽然这修复了数据泄漏,但它不一定能帮助您检测注销本身。使用我在回答中提到的反应式数据源将帮助您明确地跟踪用户的登录状态。
  • 谢谢!我遇到了同样的问题(客户端进入边缘状态,它认为在令牌过期后已登录并连接)并返回以确保在所有出版物的末尾都有一个 this.ready() ,尤其是那些检查 this.userId 的人解决了这个问题。
【解决方案2】:

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

【讨论】:

  • 我认为这不会解决问题,因为Meteor.logoutOtherClients() 会在其他浏览器(和设备)上注销用户,而不是当前会话。
【解决方案3】:

普通(如非隐身)浏览器选项卡共享相同的会话恢复令牌。当关联会话的用户状态发生变化时,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');
  }
});

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

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

【讨论】:

  • 我按照您的指示进行操作,但仍然无法在其他选项卡上跟踪已注销的用户。我用来发布用户集合的publishComposite 是否可能导致(仅_idprofile)?
  • 不幸的是,这似乎不起作用。此外,不确定最近是否发生了变化,但如果您在同一个应用程序的单独选项卡中注销,其余选项卡会收到 c[1000,"Normal closure"] WebSocket 消息,然后套接字关闭,生成一个新的,并且用户仍然登录in. Meteor.user()、Accounts.user() 和 Meteor.userId() 都仍然返回原来的登录用户。
猜你喜欢
  • 2018-07-14
  • 1970-01-01
  • 2016-01-23
  • 2022-01-20
  • 2011-09-08
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多