2011-09-18 20 views
9

sto cercando di lavorare l'esempio Redis Cookbook:Redis pub/sub per server di chat in node.js

var http = require('http'), 
io = require('socket.io') 
fs = require('fs'), 
redis = require('redis'), 
rc = redis.createClient(9189, "pike.redistogo.com"); 
rc.auth("passwd", function() { 
    console.log("Connected! to redistogo!");}); 

rc.on("connect", function() { 
    rc.subscribe("chat"); 
    console.log("rc connect event"); 
}); 

Sono successo attraverso qui, ma mai ottenere "messaggio".

rc.on("message", function (channel, message) { 
console.log("Sending: " + message); 
socketio.sockets.emit('message', message); 
}); 

webpage = http.createServer(function(req, res){ 
console.log('webpage request starting...'); 

fs.readFile('./index.htm', function(error, content) { 
    if (error) { 
     res.writeHead(500); 
     res.end(); 
    } 
    else { 
     res.writeHead(200, { 'Content-Type': 'text/html' }); 
     res.end(content, 'utf-8'); 
    } 
}); 
}); 

webpage.listen(7777); 

mia index.htm lato client è questo

<!docttype html> 
<html lang="en"> 
<head> 
    <script src ="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js">  </script> 
     <script src="http://www.heaphash.com:7777/socket.io/socket.io.js"></script> 
     <script> 
     var socket = io.connect('www.heaphash.com', { port: 7777}); 
      socket.on('message', function(data){ 
       var li = new Element('li').insert(data); 
       $('messages').insert({top: li}); 
      } 
     </script> 
     <meta charset="utf-8"> 
     <title>Chat with Redis</title> 
</head> 
<body> 
     <ul id="messages"> 
      <!-- chat messages go here --> 
     </ul> 
     <form id="chatform" action=""> 
     <input id="chattext" type="text" value="" /> 
     <input type="submit" value="Send" /> 
     </form> 
     <script> 
       $('#chatform').submit(function(){ 
         socket.emit('message', $('chattext').val()); 
         $('chattext').val(""); //cleanup the field 
         return false; 
       }); 
     </script> 
</body> 
</html> 

come fa un cliente pubblica ad una specifica Redis "chat" canale.

risposta

7

Se si utilizza la funzionalità pub/sub di redis nel proprio programma node.js, è necessario dedicare una connessione client redis per l'ascolto su alcuni canali e la seconda connessione client redis per l'invio di normali comandi e/o la pubblicazione di messaggi sul proprio canale). Da node_redis docs:

Quando un client invia un sottoscrivere o PSUBSCRIBE, che il collegamento è messo in modalità "pub/sub". A quel punto, sono validi solo i comandi che modificano il set di richieste . Quando la serie di richieste è vuota, la connessione viene ripristinata nella modalità normale.

Se è necessario inviare comandi regolari a Redis in modalità pub/sub, è sufficiente aprire un'altra connessione.

Il tuo problema è anche legato a queste domande:

1

Credo che l'esempio da quel libro manca qualcosa, ho anche letto quel libro e si chiese. Sei iscritto al canale Redis e stai aspettando messaggi sul lato server, ma non pubblichi mai quel canale. Quello che manca è un listener di eventi, quindi quando c'è un messaggio websocket, lo si pubblica sul canale redis.