Я не уверен, что это правильный способ реализации подключения к веб-сокету в 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) }
Это может быть волосато, вот что я пытаюсь сделать:
Cannot read property 'send' of undefined
По сути, внутри обратного вызова переменная this не определена. Как будто это новый объект. Я не знаком с ES6, поэтому считаю, что делаю что-то принципиально неправильное. Если бы кто-нибудь мог пролить свет на это, это было бы очень признательно.





Когда вы используете 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 класса переменной типа self перед написанием функции, а затем использовать self внутри обратного вызова onopen.
Спасибо. Не могли бы вы сказать мне, где в коде я должен назначить себя для этого?
Непосредственно перед обратным вызовом onopen, где это все еще связано с class
Спасибо. В этом случае он должен быть перед .on, потому что 'onopen находится внутри него. Это правильно?
Спасибо, Файзуддин. В этом случае, как вы думаете, как лучше всего сохранить исходный объект this.connection в обратном вызове?