2015-06-04 6 views
9

Der Server: sails.js (0.11.x) ist der ServerEmit ein Ereignis mit node.js Socket-Client zu sails.js (0.11.x)

Der Client: A node.js Skript mit [email protected] und [email protected]

Abbildung groß: ich habe, oder haben wird, eine Farm von node.js Skripte, die mit dem Server verbinden sails.js und wird verschiedene Aufgaben ausführen.

Nahziel: Ich möchte ein Ereignis während einer Socket-Verbindung von client-> Server emittieren, wie:

socket.emit('got_job', job.id); 

Warum? Wenn dies möglich ist, kann ich verschiedene Event-Handler auf der Serverseite in einem Controller (oder Controller + Service) erstellen und meinen Code sauber halten, während eine Reihe von Stateful-Transaktionen zwischen Client/Server-Endpunkten zur Unterstützung dieser Skriptfarm verwaltet wird.

Die Dokumentation: Dies ist, wie man geht über die Verwendung von socket.io-Client für sails.js dieser pro Segel docs: https://github.com/balderdashy/sails.io.js?files=1#for-nodejs

ich nicht viel Code als andere zu teilen, was diesen Link in ist, aber ich werde es hier nur für den Fall ein:

var socketIOClient = require('socket.io-client'); 
var sailsIOClient = require('sails.io.js'); 

// Instantiate the socket client (`io`) 
// (for now, you must explicitly pass in the socket.io client when using this library from Node.js) 
var io = sailsIOClient(socketIOClient); 

// Set some options: 
// (you have to specify the host and port of the Sails backend when using this library from Node.js) 
io.sails.url = 'http://localhost:1337'; 
// ... 

// Send a GET request to `http://localhost:1337/hello`: 
io.socket.get('/hello', function serverResponded (body, JWR) { 
    // body === JWR.body 
    console.log('Sails responded with: ', body); 
    console.log('with headers: ', JWR.headers); 
    console.log('and with status code: ', JWR.statusCode); 

    // When you are finished with `io.socket`, or any other sockets you connect manually, 
    // you should make sure and disconnect them, e.g.: 
    io.socket.disconnect(); 

    // (note that there is no callback argument to the `.disconnect` method) 
}); 

Was ich in sah: ich habe in verschiedenen Ebenen dieser Objekte gebohrt und ich kann nichts scheinen ausgesetzt zu finden zu verwenden. Und versuchen Sie einfach io.socket.emit(), da es nicht existiert. Aber io.socket.get() und io.socket.post(), usw. funktionieren gut.

console.log(socketIOClient); 
console.log(sailsIOClient); 
console.log(io); 
console.log(io.socket._raw); 
console.log(io.sails); 

Danke, und ich werde versuchen, dies zur Klärung bei Bedarf zu aktualisieren.

UPDATE:

Misc Server Info.:

  • Ich bin mit nginx auf Port 443 mit SSL-Terminierung, bis 4 zeigen (und bald mehr) sails.js Instanzen auf separaten Ports (3000-3003).
  • Ich verwende Redis auch für Sitzungen und Sockets.
+0

Ich habe noch eine Lösung zu finden. Es wäre schön zu wissen, ob noch jemand in diese Sache geraten ist. – nodnarB

+0

Warum machen Sie 'io.socket.disconnect();'? – Bulkin

+0

Ich kämpfe auch damit, und ich kann scheinen, eine Lösung zu finden. Ich möchte mit einer json Nachricht an den Server senden und Ereignis. nodnarB konntest du einen Workaround finden? – zabumba

Antwort

3

Sie sind in der Nähe:

Ihre io.socket.get Anruf wie ein Rest api Anruf Art ist. Sie würden eine Segel-Controller zu einem Get-Anforderung auf der URL '/ hallo',

//client 
io.socket.get('/hello', function serverResponded (body, JWR) { 
    //this is the response from the server, not a socket event handler 
    console.dir(body);//{message:"hello"} 
}); 

in

config/routes.js: 
{ 
'get /hello':'MyController.hello' 
} 

//controllers/MyController 
{ 
    hello:function(req,res){ 
    res.json({message:"hello"}); 
    } 
} 

Verfahren Sie suchen gebunden müssen, ist, io.socket.ein ('eventName');

Hier ist ein Beispiel:

//client 
    io.socket.get('/hello', function serverResponded (body, JWR) { 
     //all we're doing now is subscribing to a room 
     console.dir(body); 
    }); 
    io.socket.on('anevent',function(message){ 
     console.dir(message); 
    }); 


in 

    config/routes.js: 
    { 
    'get /hello':'MyController.hello' 
    } 

    //controllers/MyController 
    { 
     hello:function(req,res){ 
     sails.sockets.join(req.socket,'myroom'); 
     res.json({message:'youve subscribed to a room'}); 
     } 
    } 

Was haben wir effektiv getan ist, Setup unseres Buchsenteil eines „Raum“, die im Grunde ein Ereignis Namespace zu sein. Dann haben einige andere Controller nur, dies zu tun:

sails.sockets.broadcast('myroom','anevent',{message:'socket event!'}); 

Nach diesem Anruf getätigt wird, können Sie die Nachricht in dem Rückruf von io.socket.on erhalten würden (‚anEvent‘).

+0

die Frage war, wie ein Ereignis vom Browser auf den Server zu emittieren. Was Sie beschreiben, ist vom Server an alle verbundenen Clients zu emittieren – zabumba