Соединение Nodejs Websocket в классе ES6 - PullRequest
0 голосов
/ 27 июня 2019

Я не уверен, является ли это правильным способом реализации соединения с веб-сокетом в NodeJS, но проблема, с которой я сталкиваюсь, связана не с WebSockets, а с переменными класса.

Это мой класс WebSocket:

class WebSocketCalss { 

    constructor ( httpserver )
    {
        console.log("Initializing WebSocketCalss");
        this.httpServer = httpserver;
        this.connection = null;
        this.client = null;
        this.initializeWebSocket();
    }

    initializeWebSocket()
    {
        var WebSocketServer = require('websocket').server;

        var wsServer = new WebSocketServer({
            httpServer: this.httpServer
        });

        wsServer.on('request', function(request) {
            console.log((new Date()) + ' Connection from origin ' + request.origin + '.');
            this.connection = request.accept(null, request.origin); 
            console.log((new Date()) + ' Connection accepted.');
            this.connection.sendUTF(JSON.stringify({ type: "history", data: "data"} ));
            var t = 0;

            /* ---- Client ---- */
            var W3CWebSocket = require('websocket').w3cwebsocket;
            this.client = new W3CWebSocket('wss://ws.bitstamp.net');

            this.client.onerror = function() {
                console.log('Connection Error');
            };

            this.client.onopen = function() {
                console.log('WebSocket Client Connected');
                var subscribeMsg = {
                    "event": "bts:subscribe",
                    "data": {
                        "channel": "live_trades_btcusd"
                    }
                };
                this.client.send(JSON.stringify(subscribeMsg));
            };

            this.client.onclose = function() {
                console.log('echo-protocol Client Closed');
            };

            this.client.onmessage = function(e) {
                if (typeof e.data === 'string') {
                    var bitstampPrice = JSON.parse(e.data).data.price;
                    console.log(bitstampPrice);

                    this.connection.sendUTF(bitstampPrice);
                }
            };
            });



        //this.connection.sendUTF(JSON.stringify({ type: "history", data: "data"} ));
    }

}

module.exports = (httpserver) => { return new WebSocketCalss(httpserver) }

Это может быть волосатым, вот что я пытаюсь сделать:

  • Мой сервер NodeJS откроет соединение WebSocket с моим клиентом (браузером)
  • В этом WebSocket я хочу отправить значение, полученное от другого WebSocket (то есть мой NodeJS подключится как клиент)
  • Кажется, что все работает хорошо по отдельности, однако, когда я пытаюсь отправить значение (которое я получил в качестве клиента), на мой собственный клиент (так как я являюсь сервером), я получаю

Невозможно прочитать свойство 'send' из неопределенного

По сути, внутри функции обратного вызова переменная this не определена. Как будто это новый объект. Я не знаком с ES6, поэтому считаю, что я делаю что-то в корне неправильно. Если бы кто-то мог пролить свет на это, это было бы очень ценно.

1 Ответ

2 голосов
/ 27 июня 2019

Когда вы используете this внутри function(), контекст this привязывается к function, а не к внешнему классу.

this.client.onopen = () => {
    console.log('WebSocket Client Connected');
    var subscribeMsg = {
        "event": "bts:subscribe",
        "data": {
            "channel": "live_trades_btcusd"
        }
    };
    this.client.send(JSON.stringify(subscribeMsg));
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...