Задать вопрос
@OliveRrRrr

Почему событие insert отрабатывает несколько раз и как этого избежать?

подскажите, пожалуйста - имеется сервер, с запросами и поддержкой вебсокета. Ситуация следущая - с клиента отправляется только 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') }
}
  • Вопрос задан
  • 44 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы