流星注销不在选项卡之间同步
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});
});
我正在将 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});
});