在 MongoDB 中通过 Socket.io 使用 Change Stream 时,“change”被多次触发

问题描述

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

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.emit()

代码如下:

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