目标:在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 。
答案 0 :(得分:0)
关键是:
userRef.onAuth(function(authData) {
if (authData) {
...
messagesRef.limitToLast(10).on('child_added', function(snapshot) {
...
因此,无论何时使用身份验证,您都会添加一个新的侦听器,该侦听器将继续同步最后10条消息。这意味着,如果用户第二次进行身份验证,则您需要添加第二个侦听器,并且每封邮件都会收到两次child_added
次来电。
这里缺少两件事:
每当用户未经身份验证时,您应该停止收听child_added
事件
每当用户未经身份验证时,您还应该清除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();
}