Socket IO не запускает событие из одного места, а из другого - PullRequest
0 голосов
/ 18 октября 2019

Я использую SocketIO в приложении чата React и Node. Идея состоит в том, что я интегрируюсь с Whatsapp, Telegram и другими сторонними приложениями чата с моим приложением.

Проблема в самом IO сокета. Я могу получать сообщения в клиентском приложении от telegram. Я отправляю новое сообщение. Я запускаю событие с именем new_message, из которого я обрабатываю сообщение, отправляю его в Smooch для его пересылки [и я получаю сообщение в Telegram], но после обработки сообщения я запускаю точно такое же событие. срабатывает, когда я получаю новое сообщение от телеграммы, но по какой-то причине оно успешно срабатывает в новом полученном сообщении, но не когда я отправляю сообщение из своего приложения и отправляю событие после этого.

Вот мой код React

  componentDidMount = async () => {
    await this.getConversation();
    await this.getMessages();
    await this.initSocket();
  }

initSocket = async () => {
    let socket = await IO.subscribe(async message => { // this is a component that listens to 'http://localhost:4000' and for an event called '${app.id_new_message}'
      console.log(message); // this log works if message came from telegram but not if i sent a message and emitted the same event
      await this.setState(prev => ({
        messages: {
          ...prev.messages,
          docs: [
            ...prev.messages.docs,
            message
          ]
        }
      }))
    });
  }

А вот и инициализация сокета на сервере + слушатель отправляющего сообщения

io.use((socket, next) => {
  try {
    if (socket.handshake.query && socket.handshake.query.token) {
      let token = jwt.verify(socket.handshake.query.token, process.env.JWT_SECRET);
      socket.decoded = token;
      next();
    } else {
      next(new Error('Authentication Error'))
    }
  } catch (e) {
    console.log(e);
  }
}).on('connection', socket => {
  global.socket = socket;
  socket.on('new_message', message => {
    sendMessage({content: message.content, conversation: message.conversation, socket: socket}) // this function calls the smooch endpoint to forward the message + stores the message in my db then fires an event called `${app.id}_new_message` which should be listened back by the client
  })
})

Вот функция sendMessage

module.exports = async payload => {
  try {
    let send = await smooch.appUsers.sendMessage(payload.conversation.senderId, {
      type: "text",
      text: payload.content,
      role: "appMaker"
    })
    let storeMessage = await new Model.Message({role: "appMaker", type: "text", received: moment().unix(), content: payload.content, conversation: payload.conversation.id}).save()
    let getAppId = await Model.Conversation.findOne({_id: payload.conversation.id}).populate("channel");
    payload.socket.emit(`${getAppId.channel.app}_new_message`, storeMessage);
  } catch (e) {
    console.log(e);
    return e;
  }
}

В новомПолученное сообщение, все, что я делаю, это просто использую экземпляр сокета global.socket и выполняю следующие действия: \

socket.emit(`${data.app._id}_new_message`, message);

Чего здесь не хватает в моем коде?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...