簡體   English   中英

在 MongoDB 中使用更改 Stream 和 Socket.io 時,“更改”被觸發多次

[英]While using Change Stream in MongoDB with Socket.io, the on 'change' is getting triggered multiple times

我一直在嘗試捕捉任何實時更新或插入 mongodb 並使用 socket.io 在下一頁上相應地更改信息。 但是,只要數據庫中有任何更新,“更改” stream 就會被多次觸發。 我認為這也可能是套接字動作緩慢且延遲的原因。 任何形式的幫助都非常感謝。

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

@swati sinha 答案對我有用,但我也想使用更改 stream 和套接字在單獨的 function 中,所以這就是我進行一些調整的原因

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM