Управление несколькими клиентскими соединениями Websocket с помощью node.js

Я реализую клиент веб-сокета в узле, и мой веб-перехватчик пытается обрабатывать несколько подключений из службы чат-бота. Например: новый пользовательский доход, соединение через веб-сайт установлено на внешнем сервисе чат-бота. URL-адрес веб-сокета в моем коде получается через XMLHttpRequest. Затем я использую этот URL-адрес для подключения к службе чат-бота с помощью объекта ws (new WebSocket('wssUrlObtainedThroughAjaxRequest','default-protocol')). Итак, у каждого пользователя есть WebSocket. Вопрос в том, что мой код запускается последовательно. Поэтому, если два человека отправляют сообщение моему узлу webhook, что-то не работает должным образом из-за параллелизма. Что ж, я отправлю сюда пример кода, чтобы было лучше понять.

const express = require('express');
const PORT = process.env.PORT || 8002;
let WebSocket = require('ws');
let CONNECTIONS = new Map();
...
...
...
const app = express()
    .use(bodyparser.urlencoded({extended: false}))
    .use(bodyparser.json());

app.post('/', (req, res) => { 
...
...
...
    } else if (req.body.type === 'MESSAGE') {

    let DM = req.body.space.name;
    let msg = req.body.message.text;

    ws = (CONNECTIONS.get(DM)!=null) ? CONNECTIONS.get(DM) : null;

    if (ws==null || ws.readyState==3){
      controlws.gerarURLWS();
      ws = new WebSocket(controlws.urlws, 'talk-protocol');
      CONNECTIONS.set(DM,ws);
    }

    // Executes on websocket openning
    ws.onopen = function (event) {
      console.info('Canal aberto;');
      keepAliveWS();
      ws.send(JSON.stringify(msgKoreAi(msg))); 
    }

    if (ws.readyState==1)
      ws.send(JSON.stringify(msgKoreAi(msg))); 

    ws.onmessage = async function (event) {
      let resp = JSON.parse(event.data);

      if (resp.type == "bot_response") {
        text = resp.message[0].component.payload.text;

        if (text==null){ // tem quick reply
          //mount card hangouts response 
          let qreplies = resp.message[0].component.payload.payload.quick_replies; 
          card = '{"sections": [{"widgets": [{"buttons": [';
          for(let i=0; i<qreplies.length; i++){
            if (i!=qreplies.length-1)
              card+='{"textButton": {"text": "'+qreplies[i].payload+'","onClick": {"action": {"actionMethodName": "'+qreplies[i].payload+'"}}}},';
            else
              card+='{"textButton": {"text": "'+qreplies[i].payload+'","onClick": {"action": {"actionMethodName": "'+qreplies[i].payload+'"}}}}';
          }      
          card+=']}]}],"name": "respostas"}';
          card = JSON.parse(card);

          text = resp.message[0].component.payload.payload.text; 
          {
            await assyncMessage(DM, text);
            await assyncMessage(DM, card);
          }
          return;
        }

        //Send assync messages if synchronous was already sent
        if (res.headersSent){
          {
            return await assyncMessage(DM, text);
          }
        }
        else
          return res.json({text});
      }
    }
    return;
  }
...
...
...
app.listen(PORT, () => {
  console.info(`Server is running in port - ${PORT}`);
});

Привет, любая работа для этого. Я в такой же ситуации.

Qadir Hussain 12.02.2019 13:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
652
0

Другие вопросы по теме