我正在使用this教程。我需要将旧消息发送给新连接的用户。我怎样才能做到这一点?我的意思是新用户应该能够看到旧消息。
对于我的应用程序,我不需要将数据存储在数据库中。关闭服务器后,应删除数据。但是服务器在每个会话上运行多长时间客户端应该获得上一条消息
我试过了
const history = []
//Telling Express+Socket.io App To Listen To Port
io.sockets.on("connection",function(socket){
socket.emit("Start_Chat");
//On Event Registar_Name
socket.on("Register_Name",function(data){
console.log(data)
io.sockets.emit("r_name","<strong>"+data+"</strong> Has Joined The Chat");
//Now Listening To A Chat Message
socket.on("Send_msg",function(data){
history.push(data)
console.log(history)
io.sockets.emit("msg",data);
//Now Listening To A Chat Message
})
})
})
但是如何说新客户端何时输入发送历史数据?
更新:我尝试了以下内容,但始终发送历史记录
const history = []
const client = []
//Telling Express+Socket.io App To Listen To Port
io.sockets.on("connection",function(socket){
client.push({id : socket.client.id})
console.log(client)
socket.emit("Start_Chat");
//On Event Registar_Name
socket.on("Register_Name",function(data){
console.log(data)
io.sockets.emit("r_name","<strong>"+data+"</strong> Has Joined The Chat");
//Now Listening To A Chat Message
socket.on("Send_msg",function(data){
history.push(data)
console.log(history)
if(client.find(e => e.id !== socket.client.id)) {
io.sockets.emit("msg",history);
} else {
io.sockets.emit("msg",data);
}
//Now Listening To A Chat Message
})
})
答案 0 :(得分:4)
根据您想要制作聊天应用程序的复杂程度,有几种方法。
简单解决方案:您创建一些类型的数据结构(可能是一个数组),它保存最后n条消息。每当添加新消息时,您将删除添加的第一个消息。触发onConnect事件时,将整个数据结构发送到客户端。这更适用于您可以在以后更改的概念验证解决方案。
优点:易于实施
缺点:服务器上的所有数据都是易失性的,如果要重新启动应用程序,所有数据都将丢失。此外,它不会跨多个服务器实例进行扩展。
更复杂的解决方案:将所有消息存储在数据库中并查询数据库以在用户连接时检索最后n条消息。
优点:所有数据都是持久性的,如果服务器崩溃/停止,您仍然可以检索数据。
缺点:您需要维护数据库,因为消息会随着时间的推移占用更多空间。要解决此问题,您始终可以自动删除超过x天的所有邮件。
答案 1 :(得分:2)
最后,想出来
const history = []
const client = []
//Telling Express+Socket.io App To Listen To Port
io.sockets.on("connection",function(socket){
client.push({id : socket.client.id})
console.log(client)
var getClientID = client.find(e => (e.id === socket.client.id))
console.log("the Client", getClientID)
if(getClientID){
//io.sockets.emit("msg",history);
socket.emit("msg",history);
}
socket.emit("Start_Chat");
//On Event Registar_Name
socket.on("Register_Name",function(data){
console.log(data)
io.sockets.emit("r_name","<strong>"+data+"</strong> Has Joined The Chat");
//Now Listening To A Chat Message
socket.on("Send_msg",function(data){
history.push(data)
console.log(history)
io.sockets.emit("msg",data);
})
})
})
答案 2 :(得分:1)
我不建议使用套接字来检索旧邮件。您可以做的是,您可以使用AJAX检索旧消息和Socket以进行实时聊天。
答案 3 :(得分:0)
您需要将消息存储在数据库中,当新用户进入聊天时,从数据库中读取旧消息并将其显示给用户,我不认为还有其他解决方案!
<强>更新强>
所以你可以创建一个数组并以js对象的形式存储每条消息和发送者信息,当用户输入时,一旦在connection
事件中将数组发送到客户端并在客户端中解析数组你想要的方式。
关于你应该获得多长时间的问题,正如我所说的那样,你只能在客人的第一个入口处向客户发送一条上一条消息。
更新2:发送历史记录:
你可以使用socket.io的确认部分:
const history = []
//Telling Express+Socket.io App To Listen To Port
io.sockets.on("connection", function (socket) {
socket.emit("Start_Chat");
//On Event Registar_Name
socket.on("Register_Name", function (data, ack) {
io.sockets.emit("r_name", "<strong>" + data + "</strong> Has Joined The Chat");
console.log(data)
//**** Make change Here
ack({ history });
});
socket.on("Send_msg", function (data) {
history.push(data)
console.log(history)
io.sockets.emit("msg", data);
//Now Listening To A Chat Message
});
});
并在客户端部分获取ack数据:
socket.emit("Register_Name", your_data, function (ack) {
//you get the prev messages
console.log(ack);
});
并且您不需要为此存储客户端!