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

标签 node.js socket.io

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

相关文章:

json - 解析内容丰富的 Webhook(自定义 JSON 类型)

node.js - Nodejs实时在线人数统计

javascript - Socket.io:发出消息是否将所有数据发送到所有客户端?

json - Nodejs将json写入文件

javascript - 在 promise 和 async/awaits 之间混淆

node.js - 请确保您的 Service Worker 文件包含以下 :/(const precacheManifest =)\[\](;)/

node.js - 代码 ELIFECYCLE 错误 安装 expo-cli 时

java - Android:startService不会启动目标服务

android - 当应用程序在后台时将用户位置更新到服务器

java - 在android中的Socket通信中写入十六进制字符串