[英]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.