Saya sedang menulis aplikasi publikasi / langganan yang digerakkan oleh peristiwa dengan NodeJS dan Redis. Saya memerlukan contoh cara memberi tahu klien web saat nilai data di Redis berubah.
sumber
Saya sedang menulis aplikasi publikasi / langganan yang digerakkan oleh peristiwa dengan NodeJS dan Redis. Saya memerlukan contoh cara memberi tahu klien web saat nilai data di Redis berubah.
menggunakan express , socket.io , node_redis dan yang terakhir tetapi tidak kalah pentingnya kode sampel dari api media.
Pertama Anda harus (jika Anda belum melakukannya) menginstal node.js + npm dalam 30 detik (cara yang benar karena Anda TIDAK harus menjalankan npm sebagai 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
Setelah Anda menginstal node + npm, Anda harus menginstal dependensi dengan menerbitkan:
npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)
Anda dapat mengunduh sampel lengkap dari 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
Paling baik jika Anda memulai google chrome (karena dukungan websockets, tetapi tidak perlu). Kunjungi http://localhost:3000
untuk melihat sampel (pada awalnya Anda tidak melihat apa pun kecualiPubSub
sebagai judul).
Tapi di publish
saluran pubsub
Anda akan melihat pesan. Di bawah ini kami publikasikan "Hello world!"
ke browser.
publish pubsub "Hello world!"
const client = redis.createClient()
di root app.js?berikut adalah contoh sederhana tanpa banyak ketergantungan. Anda masih perlu melakukannya
npm install hiredis redis
Node JavaScript:
... taruh itu di file pubsub.js dan jalankan
node pubsub.js
di redis-cli:
yang seharusnya menampilkan:
pubsub: Hello Wonky!
di terminal yang menjalankan node! Selamat!Tambahan 4/23/2013: Saya juga ingin mencatat bahwa ketika klien berlangganan ke saluran pub / sub, ia masuk ke mode pelanggan dan terbatas pada perintah pelanggan. Anda hanya perlu membuat instance tambahan dari klien redis.
client1 = redis.createClient(), client2 = redis.createClient()
jadi satu bisa dalam mode pelanggan dan yang lain bisa mengeluarkan perintah DB biasa.sumber
pubsub/*
hanya menambahkanp
ke contoh: gantisubscibe
denganpsubscribe
danmessage
denganpmessage
.Contoh Lengkap Redis Pub / Sub ( Obrolan Waktu Nyata Nyata menggunakan Hapi.js & Socket.io)
Kami mencoba memahami Redis Publish / Subscribe (" Pub / Sub ") dan semua contoh yang ada sudah usang, terlalu sederhana atau tidak memiliki pengujian. Jadi kami menulis Obrolan Waktu Nyata Lengkap menggunakan Hapi.js + Socket.io + Contoh Redis Pub / Sub dengan Tes End-to-End !
Komponen Pub / Sub hanya beberapa baris kode node.js: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
Daripada menempelkannya di sini ( tanpa konteks apa pun ), kami mendorong Anda untuk membayar / mencoba contoh .
Kami membangunnya menggunakan Hapi.js tetapi
chat.js
file de-ditambah dari Hapi dan dapat dengan mudah digunakan dengan dasar server yang node.js http atau mengungkapkan (dll)sumber
Tangani error redis untuk menghentikan nodej agar tidak keluar. Anda dapat melakukannya dengan menulis;
Saya rasa Anda mendapatkan pengecualian karena Anda menggunakan klien yang sama yang berlangganan untuk menerbitkan pesan. Buat klien terpisah untuk menerbitkan pesan dan itu bisa menyelesaikan masalah Anda.
sumber
Lihat acani-node di GitHub , terutama file acani-node-server.js . Jika tautan ini rusak, cari acani-chat-server di antara repositori publik GitHub acani .
sumber
Jika Anda ingin membuatnya berfungsi dengan socket.io 0.7 DAN server web eksternal, Anda perlu mengubah (selain staticProvider -> masalah statis):
a) berikan nama domain sebagai ganti localhost (yaitu var socket = io.connect ('http://my.domain.com:3000');) di index.html
b) ubah HOST di app.js (yaitu, const HOST = 'domainku.com';)
c) dan tambahkan soket di baris 37 app.js (yaitu 'socket.sockets.on (' connection ', function (client) {…')
sumber
Perbarui ke kode:
sekarang berganti nama menjadi
lihat panduan migrasi
sumber
menurut solusi @alex . jika Anda memiliki kesalahan seperti ini sesuai @tyler menyebutkan:
maka Anda perlu menginstal Redis terlebih dahulu. lihat ini:
sumber