登出

时间:2016-03-08 13:42:16

标签: firebase firebase-authentication

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

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

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

问题1 :使用unAuth()注销。这会导致会话失败(通过在Chrome浏览器中进入资源 - 本地存储进行检查。)

但即使退出并继续聊天,也会将数据(带有用户名的短信)推送到Firebase存储空间。

关注与思考:在下面给出的代码中,退出后,控制台已经"客户端未经身份验证"消息是预期的行为。 authData也应该具有值null,因此不应执行相应的if块。但在这种情况下它是!

问题2 在退出并再次登录后,我获得了推送数据的双重实例以及相同数量的空白文本使用用户名。

例如,如果用户名是XYZ且文字信息是"嗨",在上述程序之后,在聊天框中有两个"嗨"与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

1 个答案:

答案 0 :(得分:0)

关键是:

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();
    }