2015-06-04 10 views
9

Serwer: sails.js (0.11.x) jest serwerememitować zdarzenie z klientem gniazda node.js tO sails.js (0.11.x)

Klient: a node.js skrypt z [email protected] i [email protected]

Duże zdjęcie: Mam lub będę mieć farmę skryptów node.js, które łączą się z serwerem sails.js i wykona różne zadania.

Bezpośrednim celem: Chcę emitować zdarzenia podczas połączenia gniazda z klient-serwer> takich jak:

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

Dlaczego? Jeśli jest to możliwe, mogę tworzyć różne procedury obsługi zdarzeń po stronie serwera w jednym kontrolerze (lub kontrolerze + usłudze) i utrzymywać mój kod w czystości, zarządzając zbiorem stanowych transakcji między punktami końcowymi klient/serwer w celu obsługi tej farmy skryptów.

Dokumentacja: To jest jak idzie o używaniu socket.io-client dla sails.js tego za żagli docs: https://github.com/balderdashy/sails.io.js?files=1#for-nodejs

nie mam dużo kodu do podzielenia inny niż to, co jest w tym linku ale będę go wkleić tutaj na wszelki wypadek:

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) 
}); 

Co mam spojrzał na: mam wiercone w różnych poziomach tych obiektów, a ja nie mogę znaleźć niczego odsłoniętą w użyciu. I po prostu próbowanie io.socket.emit(), ponieważ nie istnieje. Ale io.socket.get() i io.socket.post() itp. Działają dobrze.

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

Dzięki, a ja postaram się zaktualizować to w razie potrzeby, aby wyjaśnić.

UPDATE:

Rożne Server Info.:

  • Używam nginx na porcie 443, z rozwiązania SSL, wskazując do 4 (i wkrótce więcej) sails.js wystąpień na oddzielnych portów (3000-3003).
  • Używam również Redis do sesji i gniazd.
+0

Jeszcze nie znalazłem rozwiązania. Byłoby miło wiedzieć, czy ktoś do tego nie doszedł. – nodnarB

+0

Dlaczego tworzysz 'io.socket.disconnect();'? – Bulkin

+0

Ja też mam z tym problemy i mogę znaleźć rozwiązanie. Chcę emitować i wydarzenie z wiadomością json na serwer. nodnarB byłeś w stanie znaleźć obejście? – zabumba

Odpowiedz

3

jesteś blisko:

Rozmowa io.socket.get jest trochę jak reszta wywołania API. należałoby kontroler żagle związany żądanie GET na URL '/ Hello',

//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"} 
}); 

w

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

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

Sposób szukasz jest io.socket.on ("eventName");

Oto przykład:

//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'}); 
     } 
    } 

Co mamy zrobić to skutecznie, setup nasz gniazdko być częścią „pokój”, który jest w zasadzie nazw zdarzeń. Potem jakiś inny kontroler ma tylko to zrobić:

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

Po to połączenie jest wykonane, by pojawić się komunikat w zwrotnego z io.socket.on („anevent”).

+0

pytanie brzmiało, jak wydać wydarzenie z przeglądarki na serwer. to, co opisujesz, to emitowanie z serwera do wszystkich podłączonych klientów – zabumba