Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JAVASCRIPT] NodeJS+Websocket.IO 'ConnectedClient' object

Pagina: 1
Acties:

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 29-09 19:35
Voor een PoC probeer ik in NodeJS icm WebSocket.io een WebSockets communicatielaagje te maken. Dat is gelukt, en nu probeer ik de socket in een object te plaatsen aan de NodeJS kant. En nu loop ik tegen mijn gebrekkige kennis aan van Javascript.

Ik probeer de verbonden socket in een OO-structuur te hebben, en elk ontvangen bericht meteen weer terug te sturen. En dat lukt dus niet. Op regel 37 probeer ik het terug te sturen, maar daar zit ik in de verkeerde scope. Ook door het herschrijven van code (poging helemaal onderop) is het niet gelukt, door een andere foutmelding.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
var ws = require('websocket.io')
, http = require('http').createServer(httpRequest).listen(3000)
, server = ws.attach(http)

console.log("Running WebSocket.io version " + ws.version);

function httpRequest(req, res)
{
    res.writeHead(200, {
        'Content-Type':'text/plain'
    });
    res.end('Hello. This is a WEBSOCKETS server. Please connect with a websockets client.');
}

server.on('connection', function (socket) {
    var client = new ConnectedClient(socket)
    client.sendMessage("Hello. Welcome to websockets");
});

function ConnectedClient(_socket)
{
    var socket = _socket;
    socket.on('error', function (error){
        console.log(error);
    });
    socket.on('message', function (message)
    {
        try{
            var obj = JSON.parse(message);
            if(obj.version == undefined)
            {
                console.log("Received invalid data: "+ message + ". Cannot continue");
                return ;
            }

            console.log('Received data: '+obj.data + ' for app '+ obj.app);
            this.sendMessage(obj.data); // Error receive:TypeError: Object #<WebSocket> has no method 'sendMessage'
        }
        catch(err)
        {
            console.log("Error receive:" + err);
        }
    });
    
    socket.on('close', function()
    {
        console.log("Client disconnected");
    });
    
    this.sendMessage = function (data)
    {
        var message = JSON.stringify({
            "version" : 1.0,
            "app": 'app',
            "data": data
        });
        socket.send(message);
    }
}



Poging #2 faalt met runtime foutmelding throw new Error('addListener only takes instances of Function');:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    socket.on('message', this.handlemessage);
    this.handlemessage = function (message)
    {
        try{
            var obj = JSON.parse(message);
            if(obj.version == undefined)
            {
                console.log("Received invalid data: "+ message + ". Cannot continue");
                return ;
            }

            console.log('Received data: '+obj.data + ' for app '+ obj.app);
            this.sendMessage(obj.data); // Error receive:TypeError: Object #<WebSocket> has no method 'sendMessage'
        }
        catch(err)
        {
            console.log("Error receive:" + err);
        }
    };



Hoe kan ik toch een callback hebben voor socket.on('message', this.handlemessage); , én weten vanaf welke socket deze is binnengekomen en via die socket ook een bericht terugsturen?

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 29-09 19:35
Ok, zucht. Oplossing is door 'this' object in een aparte variabele te plaatsen. Bijvoorbeeld that, en dat dan te gebruiken. Zie regel 4 en regel 20 in dit voorbeeld:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function ConnectedClient(_socket)
{
    var socket = _socket;
    var that = this;
    
    socket.on('error', function (error){
        console.log(error);
    });
    socket.on('message', function (message)
    {
        try{
            var obj = JSON.parse(message);
            if(obj.version == undefined)
            {
                console.log("Received invalid data: "+ message + ". Cannot continue");
                return ;
            }

            console.log('Received data: '+obj.data + ' for app '+ obj.app);
            that.sendMessage(obj.data); // Error receive:TypeError: Object #<WebSocket> has no method 'sendMessage'
        }
        catch(err)
        {
            console.log("Error receive:" + err);
        }
    });
    
    
    this.sendMessage = function (data)
    {
        var message = JSON.stringify({
            "version" : 1.0,
            "app": 'app',
            "data": data
        });
        socket.send(message);
    }
}


gevonden via http://stackoverflow.com/...ion-to-a-javascript-class

[ Voor 4% gewijzigd door ChessSpider op 01-03-2013 13:52 ]