问题描述
我一直在尝试捕捉任何实时更新或插入 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);
});