web-dev-qa-db-ja.com

nodejsでredis PUBLISH / SUBSCRIBEを使用して、データ値が変更されたときにクライアントに通知する方法は?

NodeJSとRedisを使用して、イベント駆動型のパブリッシュ/サブスクライブアプリケーションを作成しています。 Redisのデータ値が変更されたときにWebクライアントに通知する方法の例が必要です。

95
guilin 桂林

OLDは参照のみを使用します

依存関係

expresssocket.ionode_redis を使用し、最後になりましたが、メディア火災からの sample code を使用します。

Node.js + npmをインストールします(非ルートとして)

最初に(まだ行っていない場合)インストールする必要があります 秒でnode.js + npm (正しい方法です[〜#〜] not [〜#〜]npmをroot)として実行します。

echo 'export PATH=$HOME/local/bin:$PATH' >> ~/.bashrc
. ~/.bashrc
mkdir ~/local
mkdir ~/node-latest-install
cd ~/node-latest-install
curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
./configure --prefix=~/local
make install # ok, fine, this step probably takes more than 30 seconds...
curl http://npmjs.org/install.sh | sh

依存関係をインストールする

Node + npmをインストールしたら、次を発行して依存関係をインストールする必要があります。

npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)

サンプルをダウンロードする

完全なサンプルは mediafire からダウンロードできます。

パッケージを解凍する

unzip pbsb.Zip # can also do via graphical interface if you prefer.

Zipの中身

./ app.js

const PORT = 3000;
const Host = 'localhost';

var express = require('express');

var app = module.exports = express.createServer();

app.use(express.staticProvider(__dirname + '/public'));

const redis = require('redis');
const client = redis.createClient();

const io = require('socket.io');

if (!module.parent) {
    app.listen(PORT, Host);
    console.log("Express server listening on port %d", app.address().port)

    const socket  = io.listen(app);

    socket.on('connection', function(client) {
        const subscribe = redis.createClient();
        subscribe.subscribe('pubsub'); //    listen to messages from channel pubsub

        subscribe.on("message", function(channel, message) {
            client.send(message);
        });

        client.on('message', function(msg) {
        });

        client.on('disconnect', function() {
            subscribe.quit();
        });
    });
}

./ public/index.html

<html>
<head>
    <title>PubSub</title>
    <script src="/socket.io/socket.io.js"></script>
    <script src="/javascripts/jquery-1.4.3.min.js"></script>
</head>
<body>
    <div id="content"></div>
    <script>    
        $(document).ready(function() {
            var socket = new io.Socket('localhost', {port: 3000, rememberTransport: false/*, transports: ['xhr-polling']*/});
            var content = $('#content');

            socket.on('connect', function() {
            });

            socket.on('message', function(message){
                content.prepend(message + '<br />');
            }) ;

            socket.on('disconnect', function() {
                console.log('disconnected');
                content.html("<b>Disconnected!</b>");
            });

            socket.connect();
        });
    </script>
</body>
</html>

サーバーを起動

cd pbsb    
node app.js

ブラウザを起動

Google Chromeを起動する場合に最適です(websocketのサポートが必要ではありませんが)。 http://localhost:3000サンプルを表示します(最初はPubSub以外はタイトルとして表示されません)。

ただし、publishからチャネルpubsubにメッセージが表示されるはずです。以下に公開します"Hello world!"ブラウザに。

./redis-cliから

publish pubsub "Hello world!"
122
Alfred

これは、依存関係のない単純化された例です。まだ_npm install hiredis redis_する必要があります

ノードJavaScript:

_var redis = require("redis"),
    client = redis.createClient();

client.subscribe("pubsub");
client.on("message", function(channel, message){
  console.log(channel + ": " + message);
});
_

... pubsub.jsファイルに入れて_node pubsub.js_を実行します

redis-cliの場合:

_redis> publish pubsub "Hello Wonky!"
(integer) 1
_

ターミナル実行ノードで_pubsub: Hello Wonky!_と表示されるはずです!おめでとうございます!

Additional 4/23/2013:また、クライアントがpub/subチャネルをサブスクライブすると、サブスクライバモードになり、サブスクライバコマンドに制限されることに注意してください。 redisクライアントの追加インスタンスを作成するだけです。 client1 = redis.createClient(), client2 = redis.createClient()ので、1つはサブスクライバモードになり、もう1つは通常のDBコマンドを発行できます。

23
nak

CompleteRedis Pub/Subの例(Hapi.jsとSocket.ioを使用したリアルタイムチャット

Redis Publish/Subscribe( "Pub/Sub")を理解しようとしていましたが、既存の例はすべて時代遅れで、単純すぎるか、テストがありませんでした。そこで、CompleteエンドツーエンドのHapi.js + Socket.io + Redis Pub/Subを使用したリアルタイムチャットを作成しましたテスト

https://github.com/dwyl/hapi-socketio-redis-chat-example

Pub/Subコンポーネントは、node.jsコードのほんの数行です。 https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js# L33-L4

ここに貼り付けるのではなく(コンテキストなし)、私たちはを奨励しますの例をチェックアウト/試してみます

Hapi.js を使用して構築しましたが、chat.jsファイルはde-coupledHapiからであり、easylybasicnode.js http serverまたはexpress(など)

7
nelsonic

Nodejsの終了を停止するには、redisエラーを処理します。書くことでこれを行うことができます。

subcribe.on("error", function(){
  //Deal with error
})

メッセージを発行するためにサブスクライブされている同じクライアントを使用しているため、例外が発生すると思います。メッセージを公開するための別のクライアントを作成すると、問題を解決できます。

4
Awemo

これをsocket.io 0.7で動作させたい場合[〜#〜] and [〜#〜]変更する必要がある外部Webサーバー(staticProvider-> staticの問題以外):

a)index.htmlで、localhostの代わりにドメイン名を指定します(つまり、var socket = io.connect( 'http://my.domain.com:3000');)

b)app.jsでホストを変更します(つまりconst Host = 'my.domain.com';)

c)app-jsの37行目にsocketsを追加します(例: 'socket.sockets.on(' connection '、function(client){…')

2
dirkk0

GitHubのacani-node 、特にファイル acani-node-server.js を確認してください。これらのリンクが壊れている場合は、 acaniのGitHubパブリックリポジトリ でacani-chat-serverを探します。

2
ma11hew28

コードの更新:

staticProvider

に改名されました

静的

移行ガイド を参照してください

1
Alex Mikhalev

@ alex ソリューションによる。 @ tyler 言及に従ってこのようなエラーが発生した場合:

node.js:134
        throw e; // process.nextTick error, or 'error'

event on first tick ^ Error: Redis connection to 127.0.0.1:6379 failed - ECONNREFUSED, Connection refused at Socket.

次に、最初に Redis をインストールする必要があります。これをチェックしてください:

http://redis.io/download

0
hbinduni