[解決済み] nodejsでredisのPUBLISH/SUBSCRIBEを使用して、データの値が変更されたときにクライアントに通知するにはどうすればよいですか?
2022-11-29 23:20:16
質問
NodeJSとRedisでイベント駆動型のパブリッシュ/サブスクライブアプリケーションを書いています。私はRedisのデータ値が変更されたときにWebクライアントに通知する方法の例を必要としています。
どのように解決するのですか?
OLDはリファレンスのみ使用
依存関係
用途 表現 , socket.io , ノード・レディス で、最後に サンプルコード のサンプルコードです。
node.js+npmのインストール(非rootで)
まず、(まだインストールしていない場合は) node.js+npmを30秒でインストールします。 (正しい方法は ではない として npm を実行します。 ルート ):
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 :)
サンプルダウンロード
サンプルは以下からダウンロードできます。 メディアファイア .
パッケージの解凍
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!"
関連
-
[解決済み】JavaScriptで「無効な日付」のDateインスタンスを検出する
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] JavaScriptでカンマを桁区切りにして数値を表示する方法
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] Node.jsを完全にアンインストールして、最初から再インストールする方法 (Mac OS X)
-
[解決済み] どのDOM要素にフォーカスがあるかを調べるには?
-
[解決済み] data-id属性を取得するにはどうすればよいですか?
-
[解決済み] Chromeの拡張機能開発にWebStormを使用するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] JavaScript で範囲を作成する - 奇妙な構文
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] サブドメインにまたがってlocalStorageを使用する
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] javascriptで文字列から関数を作成する方法はありますか?
-
[解決済み] javascriptでオプションのパラメータを扱う
-
[解決済み] これは純関数ですか?
-
[解決済み] nodejsのメッセージキューのオプションは何が良いですか?[クローズド]