我正在使用Meteor和React,并且在注销功能方面遇到了问题。当我在同一个浏览器上打开两个以上的选项卡时,如果我从一个选项卡中注销,那么其他打开的选项卡将不会被注销,但如果我使用它将会挂起。注销只有两种方法:关闭标签或刷新标签。
我尝试使用相同的登录功能并且工作正常,登录状态会在所有打开的标签页之间同步。
我当前调用注销功能的代码:
signOut: function(event) {
event.preventDefault();
Meteor.logout();
this.props.history.pushState(null, "/");
},
感谢帮助。
更新 我检查了websocket,似乎服务器确实发送了注销状态,但我的客户端代码没有调用注销方法(或者它是挂起)。然后挂起选项卡中的每个数据仍然存在。但我不知道如何进一步检查。
答案 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');
}
});
尝试登录并从其中一个标签中注销,然后观看另一个标签。
使用此技术,您可以跟踪登录状态并更改应用程序状态,并在登录状态更改时执行相应操作(例如,重定向/呈现不同的视图或布局)。