Redis pub / sub для сервера чата в node.js - PullRequest
9 голосов
/ 18 сентября 2011

Я пытаюсь работать с примером Redis Cookbook:

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

Я успешно прошел через это, но никогда не получаю "сообщение".

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это

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

, как клиент публикует на определенном канале чата Redis.

Ответы [ 2 ]

7 голосов
/ 18 сентября 2011

Если вы используете функцию redis pub / sub в своей программе node.js, вам следует выделить одно подключение клиента redis для прослушивания на каком-либо канале и второе подключение клиента redis для отправки обычных команд и / или публикации сообщений на ваш канал (ы) , От node_redis документы:

Когда клиент выдает SUBSCRIBE или PSUBSCRIBE, это соединение устанавливается в режим "паб / суб". На этом этапе только команды, которые изменяют набор подписки действителен. Когда набор подписок пуст, соединение возвращается в обычный режим.

Если вам нужно отправлять обычные команды в Redis в режиме pub / sub, просто откройте другое соединение.

Ваша проблема также связана с этими вопросами:

1 голос
/ 21 февраля 2013

Я считаю, что в примере из этой книги чего-то не хватает, я тоже прочитал эту книгу и удивился. Вы подписаны на канал Redis и ждете сообщений на стороне сервера, но вы никогда не публикуете на этом канале. Чего не хватает, так это прослушивателя событий, поэтому при появлении сообщения websocket вы публикуете это сообщение на канале redis.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...