Ich schreibe eine ereignisgesteuerte Publish / Subscribe-Anwendung mit NodeJS und Redis. Ich benötige ein Beispiel, wie Webclients benachrichtigt werden, wenn sich die Datenwerte in Redis ändern.
quelle
Ich schreibe eine ereignisgesteuerte Publish / Subscribe-Anwendung mit NodeJS und Redis. Ich benötige ein Beispiel, wie Webclients benachrichtigt werden, wenn sich die Datenwerte in Redis ändern.
verwendet express , socket.io , node_redis und nicht zuletzt den Beispielcode von media fire.
Zuerst sollten Sie (falls Sie dies noch nicht getan haben) node.js + npm in 30 Sekunden installieren (der richtige Weg, da Sie npm NICHT als root ausführen sollten ):
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
Nachdem Sie node + npm installiert haben, sollten Sie Abhängigkeiten installieren, indem Sie Folgendes ausgeben:
npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)
Sie können das vollständige Beispiel von mediafire herunterladen .
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
Am besten, wenn Sie Google Chrome starten (wegen der Unterstützung von Websockets, aber nicht erforderlich). Besuchen Sie http://localhost:3000
, um das Beispiel zu sehen (am Anfang sehen Sie nichts anderes PubSub
als den Titel).
Aber auf publish
Kanal pubsub
sollten Sie eine Nachricht sehen. Unten veröffentlichen wir "Hello world!"
im Browser.
publish pubsub "Hello world!"
const client = redis.createClient()
im Stammverzeichnis von app.js?Hier ist ein vereinfachtes Beispiel ohne so viele Abhängigkeiten. Sie müssen noch
npm install hiredis redis
Der Knoten JavaScript:
... das in eine pubsub.js Datei legen und ausführen
node pubsub.js
in redis-cli:
was angezeigt werden sollte:
pubsub: Hello Wonky!
im Terminal läuft Knoten! Glückwunsch!Zusätzliches 23.04.2013: Ich möchte auch darauf hinweisen, dass ein Client, der einen Pub / Sub-Kanal abonniert, in den Abonnentenmodus wechselt und auf Abonnentenbefehle beschränkt ist. Sie müssen nur zusätzliche Instanzen von Redis-Clients erstellen.
client1 = redis.createClient(), client2 = redis.createClient()
So kann sich einer im Abonnentenmodus befinden und der andere kann reguläre DB-Befehle ausgeben.quelle
pubsub/*
nurp
das Beispiel zu ergänzen : Ersetzensubscibe
durchpsubscribe
undmessage
durchpmessage
.Vollständiges Redis Pub / Sub-Beispiel ( Echtzeit-Chat mit Hapi.js & Socket.io)
Wir haben versucht, Redis Publish / Subscribe (" Pub / Sub ") zu verstehen, und alle vorhandenen Beispiele waren entweder veraltet, zu einfach oder hatten keine Tests. Also haben wir einen vollständigen Echtzeit-Chat mit Hapi.js + Socket.io + Redis Pub / Sub-Beispiel mit End-to-End-Tests geschrieben !
Die Pub / Sub-Komponente besteht nur aus wenigen Zeilen des node.js-Codes: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
Anstatt es hier ( ohne Kontext ) einzufügen , empfehlen wir Ihnen, das Beispiel zu überprüfen / auszuprobieren .
Wir bauten es mit Hapi.js aber die
chat.js
Datei ist entkoppelten von Hapi und kann leicht mit einem verwendet werden grundlegende node.js HTTP - Server oder Express (etc.)quelle
Behandeln Sie Redis-Fehler, um das Beenden von NodeJS zu verhindern. Sie können dies durch Schreiben tun;
Ich denke, Sie erhalten die Ausnahme, weil Sie denselben Client verwenden, der zum Veröffentlichen von Nachrichten abonniert ist. Erstellen Sie einen separaten Client zum Veröffentlichen von Nachrichten, um Ihr Problem zu lösen.
quelle
Schauen Sie sich acani-node auf GitHub an , insbesondere die Datei acani-node-server.js . Wenn diese Links nicht mehr funktionieren, suchen Sie in den öffentlichen GitHub-Repositories von acani nach einem acani-Chat-Server .
quelle
Wenn Sie dies mit socket.io 0.7 UND einem externen Webserver zum Laufen bringen möchten, müssen Sie dies ändern (neben dem staticProvider -> static-Problem):
a) Geben Sie den Domainnamen anstelle von localhost (dh var socket = io.connect ('http://my.domain.com:3000');) in der index.html an
b) Ändern Sie HOST in app.js (dh const HOST = 'my.domain.com';)
c) und fügen Sie Sockets in Zeile 37 von app.js hinzu (dh 'socket.sockets.on (' Verbindung ', Funktion (Client) {…')
quelle
Update auf den Code:
jetzt umbenannt in
Siehe Migrationshandbuch
quelle
gemäß @alex Lösung. Wenn Sie einen Fehler wie diesen gemäß @tyler haben, erwähnen Sie:
Dann müssen Sie zuerst Redis installieren . Schau dir das an:
quelle