在套接字事件上更新 MongoDB 数据
Update the MongoDB data on a socket event
我正在使用 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 中特定频道的套接字事件(“channel-join”)中的数据,当单击任何所需的频道时,该事件来自客户端。
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() 的事情吗?那行得通吗??
你可以这样做来获得一个 participants
计数器,并在每次有新客户端加入套接字时递增它。
await db.collection('sockets').findOneAndUpdate(
{ channelId: channelId },
{ $inc: { participants: 1 } },
{ upsert: true, returnOriginal: false }
)
我正在使用 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 中特定频道的套接字事件(“channel-join”)中的数据,当单击任何所需的频道时,该事件来自客户端。
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() 的事情吗?那行得通吗??
你可以这样做来获得一个 participants
计数器,并在每次有新客户端加入套接字时递增它。
await db.collection('sockets').findOneAndUpdate(
{ channelId: channelId },
{ $inc: { participants: 1 } },
{ upsert: true, returnOriginal: false }
)