gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:00:09 26 4
gpt4 key购买 nike

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

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

关于node.js - 在带有 Socket.io 的 MongoDB 中使用 Change Stream 时, 'change' 被多次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67827256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com