如何使用socket.io向新用户发送旧发送的消息

The*_*Guy 6 node.js 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){
            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
    })
    })
})
Run Code Online (Sandbox Code Playgroud)

但是我怎么能说新客户何时输入发送历史数据?

更新:我尝试了以下但它总是发送历史

 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
    })
    })
Run Code Online (Sandbox Code Playgroud)

小智 8

根据您想让聊天应用程序的复杂程度,有多种方法。

简单的解决方案:您创建某种类型的数据结构(可能是一个数组)来保存最后 n 条消息。每当添加新消息时,您都会删除添加的第一条消息。当 onConnect 事件被触发时,您将整个数据结构发送到客户端。这更多是为了您可以稍后更改的概念验证解决方案。

优点:易于实施

缺点:服务器上的所有数据本质上都是易失性的,如果您重新启动应用程序,所有数据都会丢失。此外,它不会跨多个服务器实例扩展。

稍微复杂一点的解决方案:将所有消息存储在数据库中,并在用户连接时查询数据库以检索最后 n 条消息。

优点:所有数据都是持久的,如果服务器崩溃/停止,您仍然可以检索数据。

缺点:您需要维护数据库,因为消息会随着时间的推移占用更多空间。为了解决这个问题,您可以随时自动删除所有超过 x 天的消息。


The*_*Guy 4

终于想通了

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

        })
    })
})
Run Code Online (Sandbox Code Playgroud)