在MongoDB中使用具有 Socket.io 的Change Stream时,'change'被多次触发



我一直在尝试捕捉mongodb中的任何实时更新或插入,并使用socket.io在下一页上相应地更改信息。但是,每当数据库中有任何更新时,on"change"流都会被多次触发。我认为这可能也是套接字动作缓慢和延迟的原因。任何形式的帮助都将不胜感激。

const Order = new mongoose.model("Order", orderSchema);
io.on('connection', function(socket){
console.log(socket.id);
Order.watch([{ $match: {operationType: {$in: ['insert']}}}]).
on('change', data => {
console.log('Insert action triggered'); //getting triggered thrice
console.log(new Date(), data.fullDocument);
socket.emit("changes", data.fullDocument); 
});
Order.watch([{ $match: {operationType: {$in: ['update']}}}]).
on('change', data => {
console.log('Update action triggered'); //getting triggered thrice
console.log(new Date(), data.updateDescription.updatedFields);
socket.emit("customer", data);
});
});

您需要将您的mongodb changeStreams放在io.on('connection'(之外,并使用io.emit((而不是socket.emt((

以下是示例代码:

const Order = new mongoose.model("Order", orderSchema);
io.on('connection', function(socket){
console.log(socket.id);
socket.on('disconnect', (reason) => {
console.log(reason);
});
});
Order.watch([{ $match: {operationType: {$in: ['insert']}}}]).
on('change', data => {
console.log('Insert action triggered');
console.log(new Date(), data.fullDocument);
io.emit("changes", data.fullDocument); 
});
Order.watch([{ $match: {operationType: {$in: ['update']}}}]).
on('change', data => {
console.log('Update action triggered');
console.log(new Date(), data.updateDescription.updatedFields);
io.emit("customer", data);
});

@swati-sinha答案对我有效,但我也想使用变更流和套接字作为单独的函数,所以我对进行了一些调整

const Order = new mongoose.model("Order", orderSchema);
let OrderStream = Order.watch([{ $match: {operationType: {$in: ['insert']}}}])
io.on('connection', function(socket){
console.log(socket.id);
OrderStream.on('change',function(change){
socket.emit('changes',change)
})
socket.on('disconnect', (reason) => {
console.log(reason);
});
});

最新更新