【问题标题】:Firebase user data persistence even after logging outFirebase 用户数据即使在注销后仍然存在
【发布时间】:2016-06-22 11:54:11
【问题描述】:

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

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

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

问题 1:使用unAuth() 注销。这会终止会话(通过进入 Chrome 浏览器中的资源本地存储进行检查。)

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

关注和思考:在下面给出的代码中,注销后,控制台出现“客户端未经身份验证”消息,这是预期的行为。 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

【问题讨论】:

  • 您所描述的大多数行为确实表明您在处理登录时存在错误。但是如果没有看到minimal, complete that reproduces the behavior,就无法说更多。一个好方法可能是在 jsfiddle/jsbin 中重现问题,然后编辑您的问题以包含相关代码。
  • @FrankvanPuffelen 是的,这是个好主意。我会这样做的!
  • @FrankvanPuffelen 我创建了一个 jsfiddle 供参考。您会建议 AngularFire 作为替代解决方案吗?请看一下上面编辑中提到的小提琴。

标签: firebase firebase-authentication


【解决方案1】:

关键是:

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

【讨论】:

  • 我会在实施更改后回复您。谢谢。
  • 我已经能够解决第一个问题。仍然无法弄清楚第二个 - jsfiddle.net/91swbfd7/5 每当我再次验证用户身份时,查询都会运行多次。如果我在 onAuth 块之外进行查询,它显然不起作用。请提供一些解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2015-08-24
  • 2015-04-02
  • 1970-01-01
相关资源
最近更新 更多