Отправить сообщение синхронно с Nodejs Websocket - PullRequest
0 голосов
/ 22 января 2019

Мое приложение имеет три модуля:

  1. Модуль WebSocket: находится на удаленном сервере (в Интернете) и действует как сервер Websocket, поддерживающий соединение между клиентским модулем и модулем Webhook.
  2. Модуль Webhook: находится на удаленном сервере (в Интернете) и действует как веб-крючок для ответа на HTTP-запрос пользователя.Он также подключен к модулю Websocket через websocket.
  3. Клиентский модуль: находится на моем локальном компьютере и подключен к модели Webhook через websocket.Этот клиент отвечает за получение запроса от моего локального бэкэнда.

Когда пользователь вызывает Webhook Module через HTTP Post запрос, модуль Webhook инициирует соединение с модулем WebSocket через websocket.Затем модуль WebSocket инициирует подключение к клиентскому модулю и отвечает необходимой информацией.На самом деле я должен сделать это, чтобы устранить HTTP-туннель, заблокированный в моей компании.

Проблема заключается в том, что при открытии двух окон браузера для одновременного выполнения запроса HTTP Post с другим параметром, например, с параметром «A», я ожидаю получить возвращение «A», с параметром «B», я ожидаю получить «B», а не «A».Но что-то не так с моими кодами / дизайном.Если я выполняю одновременно, я бросаю «А», тогда я получаю «В», что неправильно.Как мне преодолеть это.

Это простая диаграмма, чтобы проиллюстрировать это.enter image description here

Модуль WebSocket :

'use strict'

//This is WebSocket Server

const clients = {};
const SocketIO = require('socket.io');
const express = require('express');
const http = require('http');
const app = express();
const server = http.createServer(app);
const ws = SocketIO(server);

const port = 3000;

var clientid;

ws.on('connection', (client) => {
  clients[client.id] = client;
  console.log('new connection', client.id);

  clientid = client.id;

  client.emit('message', { message: 'welc' })

  client.on('disconnect', () => {
    delete clients[client.id];
    console.log('Client ' + client.id + ' disconnected. Deleted');
  });

  client.on('WH', function (from, msg) {
    console.log('Message from Webhook', from, ' : ', msg);
    client.broadcast.emit('message', { message: msg });

    //console.log('send to: ' + clientid);
    //ws.to(clientid).emit('hey', { message: msg });

    //client.emit('message', { message: msg })
  });

  client.on('CL', function (from, msg) {
    console.log('Message from Client', from, ' : ', msg);
    client.broadcast.emit('message', 'me', msg);

    //ws.to(client.id).emit('message', 'me', msg);
    //client.emit('message', 'me', msg);
  });


});
server.listen(process.env.PORT || port);
console.log('WebSocket Server is running on port ' + port);

Модуль Webhook

'use strict'

//This is WebHook Server

const express = require('express');
const bodyParser = require('body-parser');
const request = require('request');
const http = require('http');
const io = require('socket.io-client');

const app = express()
app.use(bodyParser.json())

const clients = {};
const SocketIO = require('socket.io');
const server = http.createServer(app);
const ws = SocketIO(server);

const port = 5000;

let Res;
let httpreq = false;
let nctid;
let ts;

const socket = io.connect('http://localhost:3000', {reconnect: true});

// Add a connect listener
socket.on('connect', function() {
    console.log('Connected to WebSocket server!');
});


socket.on('message', function(from, msg) {

    //console.log('Message from ', from, ' : ', msg);
    console.log('nctid: ' + nctid + ', ts: ' + ts);

    //Get the message from Client

    if (httpreq) {
        Res.send({
            replies: [{
                type: 'text',
                content: msg,
            }],
            conversation: {
                memory: {
                    key: msg
                }
            }
        })

        httpreq = false;
    }
});

app.listen(process.env.PORT || port, () => {
    console.log('Webhook server is running on port ' + port);
})


app.post('/', (req, res) => {
    //console.log(req.body)

    let query = req.body.nlp.entities.query[0].value;
    nctid = req.body.nlp.entities.nctid[0].value;

    ts =  Math.floor(Date.now() / 1000);

    console.log("query: " + query + '|' + nctid + '|' + ts);

    //Send message to WebSocket server with parameter query and NCTID

    socket.emit('WH', 'me', query + '|' + nctid);
    Res = res;
    httpreq = true;
})

app.post('/errors', (req, res) => {
    console.log(req.body);
    res.send();
})

Клиентский модуль

'use strict'

//This is client app running on client premise

const request = require('request');
const parser = require('xml2json');
const io = require('socket.io-client');
const socket = io.connect('http://localhost:3000', {reconnect: true});

// Add a connect listener
socket.on('connect', function(socket) {
    console.log('Connected to WebSocket server!');
});

socket.on('message', function(from, msg) {
    //console.log('MSG', from, ' : ', msg);
    console.log(from);
    let param = from.message.split('|');
    let query = param[0];
    let nctid = param[1];


    if (typeof nctid != 'undefined') {
        getNCTID(nctid, function(returnValue) {
            //console.log(returnValue);
            try {
                let json = parser.toJson(returnValue);
                json = JSON.parse(json);

                if (query == 'title')
                    socket.emit('CL', 'me', 'Title is ' + json.clinical_study.brief_title);
                else
                    socket.emit('CL', 'me', 'Status is ' + json.clinical_study.overall_status);

            } catch (e) {
                console.log(e);
                socket.emit('CL', 'me', 'No NCTID ' + nctid);
            }
        });
    }
});


function getNCTID(nctid, callback) {

    let url = "https://clinicaltrials.gov/ct2/show/" + nctid + "?displayxml=true";

    let options = {
        url: url,
        method: 'GET'
    }

    //console.log(options);
    let requestWithEncoding = function(options, callback) {
        let req = request.get(options);

        req.on('response', function(res) {
            let chunks = [];
            res.on('data', function(chunk) {
                chunks.push(chunk);
            });


            res.on('end', function() {
                let buffer = Buffer.concat(chunks);
                let encoding = res.headers['content-encoding'];
                if (encoding == 'gzip') {
                    zlib.gunzip(buffer, function(err, decoded) {
                        callback(err, decoded && decoded.toString());
                    });
                } else if (encoding == 'deflate') {
                    zlib.inflate(buffer, function(err, decoded) {
                        callback(err, decoded && decoded.toString());
                    })
                } else {
                    callback(null, buffer.toString());
                }
            });
        });


        req.on('error', function(err) {
            callback(err);
        });
    }


    requestWithEncoding(options, function(err, data) {
        if (err) {
            console.log('err:' + err);
            callback('error');
        } else
            //console.log(data);
            callback(data);
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...