2011-09-18 26 views
9

Estoy tratando de trabajar el ejemplo Redis Cookbook:Redis pub/sub para el servidor de chat en 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"); 
}); 

tengo éxito por aquí, pero nunca sale "mensaje".

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

mi index.htm lado del cliente es este

<!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> 

cómo publicar un cliente a un Redis específica "chat" canal.

Respuesta

7

Si está utilizando la funcionalidad redis pub/sub dentro de su programa node.js, debe dedicar una conexión de cliente redis para escuchar en algún canal y una segunda conexión al cliente redis para enviar comandos normales y publicar mensajes en su canal) De node_redis docs:

Cuando un cliente envía una suscripción o PSUBSCRIBE, esa conexión se pone en modo de "pub/sub". En ese punto, solo los comandos que modifican el conjunto de suscripción son válidos. Cuando el conjunto de suscripción está vacío, la conexión se vuelve a poner en modo normal.

Si necesita enviar comandos regulares a Redis mientras está en el modo pub/sub, solo abra otra conexión.

Su problema está relacionado también con estas preguntas:

1

creo que el ejemplo de ese libro le falta algo, yo también he leído ese libro y se preguntó. Estás suscrito al canal Redis y estás esperando mensajes del lado del servidor, pero nunca lo publicas en ese canal. Lo que falta es un detector de eventos, por lo que cuando hay un mensaje de websocket, publica ese mensaje en el canal de redis.

Cuestiones relacionadas