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

时间:2018-02-01 11:43:27

标签: node.js socket.io

我正在使用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
    })
    })

4 个答案:

答案 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);
    });

并且您不需要为此存储客户端!