NodeJSとRedisを使用して、イベント駆動型のパブリッシュ/サブスクライブアプリケーションを作成しています。 Redisのデータ値が変更されたときにWebクライアントに通知する方法の例が必要です。
express 、 socket.io 、 node_redis を使用し、最後になりましたが、メディア火災からの sample code を使用します。
最初に(まだ行っていない場合)インストールする必要があります 秒で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.
./ 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!"
ブラウザに。
publish pubsub "Hello world!"
これは、依存関係のない単純化された例です。まだ_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コマンドを発行できます。
Redis Publish/Subscribe( "Pub/Sub")を理解しようとしていましたが、既存の例はすべて時代遅れで、単純すぎるか、テストがありませんでした。そこで、CompleteエンドツーエンドのHapi.js + Socket.io + Redis Pub/Subを使用したリアルタイムチャットを作成しましたテスト!
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からであり、easylyはbasicnode.js http serverまたはexpress(など)
Nodejsの終了を停止するには、redisエラーを処理します。書くことでこれを行うことができます。
subcribe.on("error", function(){
//Deal with error
})
メッセージを発行するためにサブスクライブされている同じクライアントを使用しているため、例外が発生すると思います。メッセージを公開するための別のクライアントを作成すると、問題を解決できます。
これを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){…')
GitHubのacani-node 、特にファイル acani-node-server.js を確認してください。これらのリンクが壊れている場合は、 acaniのGitHubパブリックリポジトリ でacani-chat-serverを探します。