Соединение Nodejs Websocket в классе ES6

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

Это мой WebSocketClass:

class WebSocketCalss { 

    constructor ( httpserver )
    {
        console.info("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.info((new Date()) + ' Connection from origin ' + request.origin + '.');
            this.connection = request.accept(null, request.origin); 
            console.info((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.info('Connection Error');
            };

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

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

            this.client.onmessage = function(e) {
                if (typeof e.data === 'string') {
                    var bitstampPrice = JSON.parse(e.data).data.price;
                    console.info(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 будет подключаться как клиент)
  • Кажется, все работает нормально по отдельности, однако, когда я пытаюсь отправить значение (которое я получил как клиент) своему собственному клиенту (поскольку я являюсь сервером), я получаю

Cannot read property 'send' of undefined

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 163
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Спасибо, Файзуддин. В этом случае, как вы думаете, как лучше всего сохранить исходный объект this.connection в обратном вызове?

madu 28.06.2019 02:46

Есть простой способ: присвоить this класса переменной типа self перед написанием функции, а затем использовать self внутри обратного вызова onopen.

Faizuddin Mohammed 28.06.2019 02:47

Спасибо. Не могли бы вы сказать мне, где в коде я должен назначить себя для этого?

madu 28.06.2019 03:02

Непосредственно перед обратным вызовом onopen, где это все еще связано с class

Faizuddin Mohammed 28.06.2019 03:04

Спасибо. В этом случае он должен быть перед .on, потому что 'onopen находится внутри него. Это правильно?

madu 28.06.2019 03:06

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