我正在使用 this教程。我需要将旧消息发送给新连接的用户。我怎样才能做到这一点?我的意思是新用户应该能够看到旧消息。
对于我的应用程序,我不需要将数据存储在数据库中。服务器关闭后,数据应被删除。但是服务器在每个 session 上运行多长时间,客户端应该得到以前的消息
我试过了
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
})
})
最佳答案
有多种方法,具体取决于您希望使聊天应用程序变得多么复杂。
简单的解决方案:您创建某种类型的数据结构(可能是数组)来保存最后 n 条消息。每当添加新消息时,您都会删除添加的第一条消息。当 onConnect 事件被触发时,您将整个数据结构发送给客户端。这更像是一个概念验证解决方案,您可以稍后更改。
优点:易于实现
缺点:服务器上的所有数据本质上都是易变的,如果您重新启动应用程序,所有数据都会丢失。此外,它不会跨多个服务器实例进行扩展。
稍微复杂一点的解决方案:将所有消息存储在数据库中,并在用户连接时查询数据库以检索最后 n 条消息。
优点:所有数据都是持久的,如果服务器崩溃/停止,您仍然可以检索数据。
缺点:您需要维护数据库,因为消息会随着时间的推移占用更多空间。要解决此问题,您始终可以自动删除早于 x 天的所有消息。
关于node.js - 如何使用 socket.io 向新用户发送旧的已发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48561935/