【问题标题】:Update the MongoDB data on a socket event在套接字事件上更新 MongoDB 数据
【发布时间】:2021-07-30 08:44:23
【问题描述】:

我正在使用 React 和 Node.js 构建一个消息传递应用程序。数据被建模并存储在 MongoDb 中。我正在使用猫鼬进行数据库连接。我成功地能够在 api 调用 (/getChannels) 上显示数据。

app.get("/api/getChannels",cors(corsOptions), async (req,res,next) => {
    let try_channels = await Chat.find((c) => {
        return c
    });
   res.send({
       channels: try_channels
    });
})

但我想在单击任何所需通道时来自客户端的套接字事件(“通道连接”)上更新 mongoDB 中特定通道的数据。

    const handleSelect = (id) => {
        let selected_channel = channels.find((c) => {
            return c. id === id
        })
        setChannel(selected_channel)
     
        socket.emit("channel-join", id, ack => {
    });
 };

在服务器端,我正在监听事件并想更新 mongodb 中的数据以显示我已加入特定频道。我可以通过以下逻辑在 server.js 文件中包含一组通道来做到这一点

 socket.on('channel-join',id =>{
        console.log('channel-join',id)
        STATIC_CHANNELS.forEach(c => {
            if (c.id === id) {
                if (c.sockets.indexOf(socket.id) == (-1) ) {
                    console.log(socket.id)
                    c.sockets.push(socket.id);
                    c.participants++;
                    console.log(c.sockets,c.participants)
                    io.emit('channel' , c)
                }
            }else {
                let index = c.sockets.indexOf(socket.id);
                console.log(index)
                if (index != (-1) ) {
                    c.sockets.splice(index , 1)
                    c.participants--;
                    console.log(c.sockets,c.participants);
                    io.emit('channel',c);
                }
            }
        })
    })

但我无法让它为 mongodb 中的数据工作。我应该先将所有数据提取到数组然后使用它吗?但这会首先取消使用数据库的意义,不是吗? 我应该做类似 mongoose_model.findAndUpdate() 的事情吗?这行得通吗??

【问题讨论】:

    标签: node.js reactjs mongodb mongoose create-react-app


    【解决方案1】:

    你可以做这样的事情来拥有一个participants 计数器,并在每次有新客户端加入套接字时递增它。

    await db.collection('sockets').findOneAndUpdate(
      { channelId: channelId },
      { $inc: { participants: 1 } },
      { upsert: true, returnOriginal: false }
    )
    

    【讨论】:

    • 非常感谢@sks147,有什么办法可以更新所有其他不匹配的文档,以便客户端在任何给定时间只连接到一个套接字。
    猜你喜欢
    • 2021-03-19
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2020-08-30
    • 1970-01-01
    • 2016-03-08
    • 2020-09-24
    相关资源
    最近更新 更多