подскажите, пожалуйста - имеется сервер, с запросами и поддержкой вебсокета. Ситуация следущая - с клиента отправляется только 1 сообщение, в монгодб создается одна запись, ответ приходит два раза, я пытался как то подебажить, но newMessage почему то выводится 2 раза, а modifiedMessage - 1 раз, я если что веб учу и еще не силен в серверной части. Я решил проблему заведя сет коллекцию, но выглядит костыльно, подскажите почему insert отрабатывает рандомное количество раз
ЗЫ: это единственный контроллер и нигде больше вебсокеты не слушаются
const mongoose = require('mongoose')
const messageService = require('../service/message-service')
const handledMessages = new Set()
const handleWebSocketConnection = (ws) => {
const messageChangeStream = mongoose.connection
.collection('messages')
.watch({ fullDocument: 'updateLookup' })
messageChangeStream.on('change', async (change) => {
console.log('Received change event:', change)
if (handledMessages.has(change.documentKey._id.toString())) {
console.log('Duplicate change event. Ignoring.')
return
}
handledMessages.add(change.documentKey._id.toString())
switch (change.operationType) {
case 'insert':
const newMessage = change.fullDocument
console.log('New message:', newMessage)
ws.send(
JSON.stringify({
processing: 'add',
message: newMessage,
})
)
break
}
})
ws.on('message', async (clientMessage) => {
const parsedMessage = JSON.parse(clientMessage)
switch (parsedMessage.processing) {
case 'add':
await messageService.addMessage(parsedMessage)
break
}
})
ws.on('close', () => {
console.log('WebSocket connection closed.')
})
}
module.exports = { handleWebSocketConnection }
это событие ивента и они абсолютно одинаковы
Received change event: {
_id: {
_data: '82658682840000002B2B022C0100296E5A10047F5B7E4D943644A8B0186BF32A81AF9846645F696400646586828662F7791D41DBE40F0004'
},
operationType: 'insert',
clusterTime: new Timestamp({ t: 1703314052, i: 43 }),
wallTime: 2023-12-23T06:47:32.882Z,
fullDocument: {
_id: new ObjectId('6586828662f7791d41dbe40f'),
user: { id: new ObjectId('6580a43e8201344d8d8c0d8a'), name: 'semen' },
text: 'Lorem, ipsum dolor sit amet consectetur adipisicing elit',
timestamp: '2023-12-23T06:47:34.325Z',
read: false,
delivered: true,
type: 'text',
replyTo: null,
__v: 0
},
ns: { db: 'test', coll: 'messages' },
documentKey: { _id: new ObjectId('6586828662f7791d41dbe40f') }
}