2014-11-21 4 views
0

Я новичок в nodejs, и я пытаюсь решить проблему связи с внешней системой.Nodejs websocket связь с внешней системой

Существует шлюз для внешней системы, который может обрабатывать запросы websocket на порте 5000. В приведенном ниже примере, когда вы запрашиваете главную страницу, nodejs открывает соединение с веб-сервером, а затем в событии открывания websocket отправляет запрос и ожидает ответа, который используется для ответа HTTP.

Вы знаете, как открыть websocket для внешней системы только один раз и обрабатывать запросы на основе идентификатора запроса?

var ws = require('ws'); 
var express = require('express'); 
var async = require('async'); 
var uuid = require('node-uuid'); 

app = express(); 

app.get('/', function (req, res) { 
    var webSocket = new ws('ws://localhost:5000/'); 
    async.series([ 
     function (callback) { 
      webSocket.on('open', function() { 
       webSocket.send(JSON.stringify({query:'data query', requestid: uuid.v4()})); 
       callback(null, 'data query'); 
      });    
     }, 
     function (callback) { 
      webSocket.on('message', function (data, flags) { 
       callback(null, data); 
      }) 
     } 
    ], function (err, results) { 
     res.setHeader('content-type', 'text/javascript'); 
     res.send(results[1]); 
     webSocket.terminate(); 
    }); 
}); 

var server = app.listen(3000, function() { 
    var port = server.address().port 
    console.log('Listening at %s', port) 
}); 
+0

Вы бы не просто открыть веб-сокет при любом запуске сервера или запрос на первой странице, а затем сохранить этот сокет в переменной вне конкретного запроса. Затем вы можете использовать этот сокет для любых будущих запросов. Если вы собираетесь одновременно запускать несколько запросов по одному и тому же веб-узлу из нескольких запросов на страницу, тогда вам нужно будет различать, какой ответ веб-памяти принадлежит с каким запросом. – jfriend00

+0

Или вы можете поддерживать N веб-гнезд в кеше и просто извлекать один из кеша при поступлении запроса, а затем возвращать его в кеш при выполнении запроса. – jfriend00

ответ

1

Спасибо за подсказки. Я закончил следующее решение, которое делает то, что я ожидал:

var ws = require('ws'); 
var express = require('express'); 
var uuid = require('node-uuid'); 

var requests = {}; 

app = express(); 

var webSocket = new ws('ws://localhost:5000/'); 
webSocket.on('open', function() { 
    console.log('Connected!'); 
});    

webSocket.on('message', function (data, flags) { 
    var json = JSON.parse(data); 
    console.log(json.requestId); 
    var res = requests[json.requestId]; 
    res.setHeader('content-type', 'text/javascript'); 
    res.send(json.data); 
    delete requests[json.requestId]; 
}); 


app.get('/', function (req, res) { 
    var rid = uuid.v4(); 
    requests[rid] = res; 
    webSocket.send(JSON.stringify({query:'data query', requestId: rid})); 
}); 

var server = app.listen(3000, function() { 
    var port = server.address().port 
    console.log('Listening at %s', port) 
}); 
Смежные вопросы