2015-06-04 7 views
9

Il server: sails.js (0.11.x) è il serveremettono un evento con il cliente presa node.js a sails.js (0.11.x)

Il cliente: A node.js script con [email protected] e [email protected]

Grande foto: ho, o avranno una fattoria di script Node.JS che si collegano al server sails.js e svolgerà vari compiti.

obiettivo immediato: voglio emettere un evento durante una connessione socket da client-> server, ad esempio:

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

Perché? Se ciò è possibile, posso creare vari gestori di eventi sul lato server in un controller (o controller + servizio) e mantenere pulito il mio codice mentre gestisco un insieme di transazioni stateful tra endpoint client/server per supportare questo script farm.

La documentazione: Questo è come si va sull'utilizzo socket.io-client per sails.js questo per vele docs: https://github.com/balderdashy/sails.io.js?files=1#for-nodejs

Non ho molto codice per condividere diverso da quello che c'è in quel link, ma mi incollo qui solo nel caso in cui:

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

quello che ho guardato in: ho forato in vari livelli di questi oggetti e io non riesco a trovare nulla esposti da usare. E semplicemente provando io.socket.emit() perché non esiste. Ma io.socket.get() e io.socket.post(), ecc. Funzionano bene.

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

Grazie, e cercherò di aggiornare questo come necessario per chiarimenti.

UPDATE:

Varie Info Server.:

  • sto usando nginx sulla porta 443, con terminazione SSL, che punta a 4 (e presto più) sails.js istanze su porte separate (3000-3003).
  • Sto anche utilizzando Redis per sessioni e socket.
+0

Devo ancora trovare una soluzione. Sarebbe bello sapere se qualcun altro si è imbattuto in questo. – nodnarB

+0

Perché stai facendo 'io.socket.disconnect();'? – Bulkin

+0

Anche io sto lottando con questo, e posso sembrare di trovare una soluzione. Voglio emettere ed evento con un messaggio json al server. nodnarB sei riuscito a trovare una soluzione alternativa? – zabumba

risposta

3

Sei vicino:

La chiamata io.socket.get è un po 'come una chiamata API REST. Avreste bisogno di un controller vele legato ad una richiesta GET sulla url '/ ciao',

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

Il metodo che stai cercando è, io.socket.on ('eventName');

Ecco un esempio:

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

Quello che abbiamo fatto in modo efficace è, messa a punto la nostra presa di essere parte di una "stanza", che è fondamentalmente uno spazio dei nomi evento. Poi, qualche altro controller ha a che fare solo questo:

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

Dopo questa chiamata viene effettuata, si dovrebbe ricevere il messaggio nel callback di io.socket.on ('anevent').

+0

la domanda era come emettere un evento dal browser al server. quello che descrivi, è quello di emettere dal server a tutti i client connessi – zabumba

Problemi correlati