Firebase 用户数据在注销后仍然存在

Firebase user data persistence even after logging out

目标:学习在 Firebase 中制作聊天应用程序。参考来源

状态:基本聊天功能已完成。使用 google 提供商进行登录,并在聊天时使用相应的用户名。 工作 除了给定的问题情况。

编辑1:下面提到的所有问题都可以在给出的最小,完整和可验证的示例link中验证在末尾。聊天代码取自 firebase 文档 - https://www.firebase.com/tutorial/#session/iq2koybqhgq 需要对 google 登录进行修改。

问题 1:使用 unAuth() 退出。这会终止会话(通过在 Chrome 浏览器中进入 Resources-Local Storage 进行检查。)

但即使在注销 并继续聊天后,它也会将数据(带有用户名的文本消息)推送到 Firebase 存储中。

关注和思考:在下面给出的代码中,注销后,控制台有 "Client unauthenticated" 消息,这是预期的行为。此外,authData 的值应为 null,因此不应执行相应的 if 块。但在这种情况下是!

问题 2注销 并再次登录 我得到了双重实例推送数据的数量以及与用户名相同数量的空白文本。

例如,如果用户名是 XYZ,短信是 "Hi",经过上述步骤后,在聊天框中有两个实例 "Hi" 和 XYZ(有时还有任何其他已登录的用户名)以及两个带有空文本消息的 XYZ 实例。

关注与思考:我认为是多次登录导致的问题。这也可能是由于数据的存储方式(异步)。

代码:

userRef.onAuth(function(authData) {
    if (authData) {
        //code to push the username and corresponding text message into firebase
    } else {
        console.log("Client unauthenticated.");
    }
});

我在堆栈上检查了很多其他问题,但我认为这些错误是我的代码特有的。如果需要任何进一步的信息,请询问。

编辑2:https://jsfiddle.net/91swbfd7/5/ - 问题1已解决通过一些调整。仍然无法解决 问题 2

关键的一点是:

userRef.onAuth(function(authData) {
  if (authData) {
    ...
    messagesRef.limitToLast(10).on('child_added', function(snapshot) {
      ...

因此,只要使用经过身份验证,您就会添加一个新的侦听器,它将保持同步最后 10 条消息。这意味着如果用户第二次进行身份验证,您将添加第二个侦听器,并且每条消息都会收到两次 child_added 调用。

这里缺少两件事:

  1. 只要用户未通过身份验证,您就应该停止侦听 child_added 事件

  2. 只要用户未通过身份验证,您还应该清除来自 HTML:

    的消息
    var query;
    if (authData) {
      ...
      query = messagesRef.limitToLast(10)
      query.on('child_added', function(snapshot) {
    } else {        //If client is logged out
      console.log("Client unauthenticated.");
      query.off('child_added');
      messageList.empty();
    }