2011-09-18 29 views
9

Tôi đang cố gắng để làm việc ví dụ Redis Cookbook:Redis pub/sub cho máy chủ trò chuyện trong 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"); 
}); 

tôi thành công qua đây nhưng không bao giờ nhận được "thông điệp."

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

index.htm phía khách hàng của tôi là thế này

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

như thế nào một khách hàng phát hành tới một Redis cụ thể "trò chuyện" kênh.

Trả lời

7

Nếu bạn đang sử dụng chức năng pub/phụ redis trong chương trình node.js, bạn nên dành một kết nối máy khách redis để nghe trên một số kênh và kết nối máy khách thứ hai để gửi lệnh bình thường và/hoặc xuất bản tin nhắn tới kênh của bạn). Từ node_redis tài liệu:

Khi một khách hàng đưa ra một đăng ký hoặc PSUBSCRIBE, kết nối được đặt vào chế độ "pub/sub". Tại thời điểm đó, chỉ các lệnh sửa đổi bộ đăng ký mới hợp lệ. Khi bộ đăng ký trống, kết nối sẽ được đưa trở lại chế độ thông thường.

Nếu bạn cần gửi lệnh thông thường tới Redis khi đang ở chế độ pub/sub, chỉ cần mở một kết nối khác.

Vấn đề của bạn cũng liên quan đến những câu hỏi này:

1

Tôi tin rằng các ví dụ từ cuốn sách đó là thiếu cái gì, tôi cũng đọc cuốn sách đó và tự hỏi. Bạn đã đăng ký kênh Redis và đang chờ tin nhắn ở phía máy chủ nhưng bạn không bao giờ xuất bản lên kênh đó. Những gì còn thiếu là một trình lắng nghe sự kiện vì vậy khi có một thông điệp websocket, bạn xuất bản thông báo đó tới kênh redis.

Các vấn đề liên quan