首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Firebase数据库JavaScript实现Web应用中的即时聊天

用Firebase数据库JavaScript实现Web应用中的即时聊天
EN

Stack Overflow用户
提问于 2018-05-03 23:16:29
回答 1查看 1.7K关注 0票数 1

在我的网站上,我使用Firebase数据库创建了一个即时消息服务。我有聊天的功能,所以用户可以发送一条消息到聊天,这将显示在显示框中。

我遇到的问题是,当创建一个新的聊天并且用户开始对话时,消息按照他们正在进行的对话的顺序出现,如下所示:

但是,当刷新页面并从数据库中提取消息时,将显示如下内容。

我的聊天数据库结构如下:

我的JS聊天代码是:

代码语言:javascript
复制
firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
	var db = firebase.database();
	var currentProperty = localStorage.getItem("prop");
	
	db.ref('addresses/'+currentProperty+'/chat/group').on("child_added", function(data){
		//Set Local Variables
		var message = data.child("message").val();
		var date = data.child("date").val();
		var sender = data.child("uid").val();
		var time = data.child("time").val();
		var who;
		var getCurrentDate = new Date;
		day = getCurrentDate.getDate();
		month = getCurrentDate.getMonth() + 1;										
		year = getCurrentDate.getFullYear();
		var newDate = [day, month, year].join('/');
		var title = document.getElementById("chatTitle");
		db.ref('addresses/'+currentProperty+'/firstLine').once("value", function(snapshot){
			title.innerHTML = "<i class='fas fa-home' style='font-size:150%;margin-right:10px'></i>Group chat with all persons involved with " + capitalLetter(snapshot.val());
		});
		
		if(sender == user.uid){who = 'boxCurrent currentUser';}
		else
		{who = 'boxOther otherUser';}
		
		if(date == newDate){date = 'Today'}
		
		db.ref('users/'+sender+'/firstName').on('value', function(data){
			var name = data.val();
			if(who == 'boxCurrent currentUser'){
				var messageD = "<div id='userMessageDisplay' style='width:100%;text-align:end;'><span class='message-data-time'>"+time+",  "+date+"    </span><span id='userName'>"+name+"</span><div id='hello' class='"+who+"' style= height:100%;'>"+message+"</div></div>";
			$('#displayBox').append(messageD);
			}
			else{
				var messageD = "<div id='userMessageDisplay' style='width:100%;'><span class='message-name'>"+name+"</span><span class='message-data-time'>    "+time+",  "+date+"</span><div id='hello' class='"+who+"' style='width:70%; height:100%;'>"+message+"</div></div>";
			$('#displayBox').append(messageD);
			}
		});
	});
	
	db.ref('addresses/'+currentProperty+'/tenant').orderByKey().once("value", function(snapshot){
		snapshot.forEach(function(child){
		  var key = child.key;
		  console.log(key);
		  db.ref('users/'+key+'/firstName').once("value", function(data){
			  var first = data.val();
			  var appendFirst = "<li style='padding: 5px 10px 0 10px; height:75px;'><i class='fas fa-user-circle' style='font-size:400%; float:left;color:#6a6c75;'></i><div class='about' style='height:100%;padding: 10px 0 0 70px;'><div id='append2"+key+"' class='profileName' style='color:#fff;'>"+first;
			  $('#peopleList').append(appendFirst);

		  });
		  db.ref('users/'+key+'/lastName').once("value", function(data){
			  var last = data.val();
			  var appendLast = " "+last+"</div>"
			  $('#append2'+key).append(appendLast);
		  });
		  db.ref('users/'+key+'/onlineStatus').once("value", function(data){
			  var onlineStatus = data.val();
			  console.log(onlineStatus);
			  if(onlineStatus == 'Online'){
			  var appendStatus = "<div class='status' style='color:#a8aac3;'><i class='fa fa-circle' online style='color:#86BB71; margin-right:10px;font-size:80%;border:1px solid #fff;border-radius:50%;'></i>Online</div></div></li>"
			  $('#append2'+key).append(appendStatus);
			  }
			  else{
				  appendStatus = "<div class='status' style='color:#a8aac3;'><i class='fa fa-circle offline' style='color:#E38968;margin-right:10px;font-size:80%;border:1px solid #fff;border-radius:50%;'></i>Offline</div></div></li>"
				  $('#append2'+key).append(appendStatus);
			  }
		  });
		});
	});
	
  } else {
    // No user is signed in.
	location = 'index.html'
  }
});

function sendMessage(){
	var theDiv = document.getElementById('displayBox');
	var message = document.getElementById("messageInput").value;
	var currentProperty = localStorage.getItem("prop");
	var user = firebase.auth().currentUser;
	//date
	var date = new Date;
	day = date.getDate();
	month = date.getMonth() + 1;										
	year = date.getFullYear();
	var newDate = [day, month, year].join('/');
	var db = firebase.database();
	//time
	hours = date.getHours(); // => 9
	mins = date.getMinutes(); // =>  30
	var time = [hours, mins].join(':');
	console.log(time);
	
	var messageDetails = {
		"uid": user.uid,
		"message": message,
		"date": newDate,
		"time": time
		}
		
	if(message == ''){
		document.getElementById("messageInput").style.border = '1px solid red';
	}
	else{
		db.ref('addresses/'+currentProperty+'/chat/group').push(messageDetails).then(function(){
			document.getElementById("messageInput").value = '';
			theDiv.scrollTop = '99999';
		});
	}
}

很抱歉发了这么长的帖子,但有人知道为什么当页面刷新时,消息会聚集在一起,购买发送消息的用户吗?

此外,解决问题的任何解决方案都将非常有帮助。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-05-03 23:43:08

我建议您更改存储消息时间戳的方式。我会将它们存储为firebase时间戳,如下所示:https://firebase.google.com/docs/reference/js/firebase.database.ServerValue

然后,当您提取它们时,您希望使用orderByChild,然后从这里找到的检索数据信息中使用startAthttps://firebase.google.com/docs/database/admin/retrieve-data

然后,这将根据消息的时间戳而不是其键对消息进行排序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50158527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档