Estoy escribiendo una aplicación de publicación / suscripción basada en eventos con NodeJS y Redis. Necesito un ejemplo de cómo notificar a los clientes web cuando cambian los valores de los datos en Redis.
fuente
Estoy escribiendo una aplicación de publicación / suscripción basada en eventos con NodeJS y Redis. Necesito un ejemplo de cómo notificar a los clientes web cuando cambian los valores de los datos en Redis.
usa express , socket.io , node_redis y, por último, pero no menos importante, el código de muestra de media fire.
Primero debe (si aún no lo ha hecho) instalar node.js + npm en 30 segundos (de la manera correcta porque NO debe ejecutar npm como 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
Después de instalar node + npm, debe instalar las dependencias emitiendo:
npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)
Puede descargar una muestra completa de 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
Lo mejor es iniciar Google Chrome (debido a la compatibilidad con websockets, pero no es necesario). Visita http://localhost:3000
para ver una muestra (al principio no ves nada más PubSub
que un título).
Pero en el publish
canal pubsub
, debería ver un mensaje. A continuación publicamos "Hello world!"
en el navegador.
publish pubsub "Hello world!"
const client = redis.createClient()
en la raíz de app.js?aquí hay un ejemplo simplificado sin tantas dependencias. Todavía necesitas
npm install hiredis redis
El nodo JavaScript:
... poner eso en un archivo pubsub.js y ejecutar
node pubsub.js
en redis-cli:
que debería mostrarse:
pubsub: Hello Wonky!
en el nodo en ejecución del terminal! ¡Felicidades!Adicional 23/4/2013: También quiero señalar que cuando un cliente se suscribe a un canal pub / sub, entra en modo de suscriptor y está limitado a los comandos de suscriptor. Solo necesitará crear instancias adicionales de clientes de redis.
client1 = redis.createClient(), client2 = redis.createClient()
por lo que uno puede estar en modo de suscriptor y el otro puede emitir comandos DB regulares.fuente
pubsub/*
agregarp
al ejemplo: reemplazarsubscibe
conpsubscribe
ymessage
conpmessage
.Ejemplo completo de Redis Pub / Sub ( chat en tiempo real con Hapi.js y Socket.io)
Estábamos tratando de entender Redis Publish / Subscribe (" Pub / Sub ") y todos los ejemplos existentes estaban desactualizados, eran demasiado simples o no tenían pruebas. ¡Así que escribimos un chat en tiempo real completo usando Hapi.js + Socket.io + Redis Pub / Sub Example con pruebas de extremo a extremo !
El componente Pub / Sub tiene solo unas pocas líneas de código node.js: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
En lugar de pegarlo aquí ( sin ningún contexto ), le recomendamos que consulte / pruebe el ejemplo .
Lo construimos usando Hapi.js pero el
chat.js
archivo está desacoplado de Hapi y se puede usar fácilmente con un servidor http básico de node.js o express (etc.)fuente
Maneje los errores de redis para evitar que nodejs salga. Puede hacerlo escribiendo;
Creo que obtiene la excepción porque está usando el mismo cliente que está suscrito para publicar mensajes. Cree un cliente separado para publicar mensajes y eso podría resolver su problema.
fuente
Consulte acani-node en GitHub , especialmente el archivo acani-node-server.js . Si estos enlaces están rotos, busque acani-chat-server entre los repositorios públicos de GitHub de acani .
fuente
Si desea que esto funcione con socket.io 0.7 Y un servidor web externo, debe cambiar (además del staticProvider -> problema estático):
a) proporcionar el nombre de dominio en lugar de localhost (es decir, var socket = io.connect ('http://my.domain.com:3000');) en el index.html
b) cambiar HOST en app.js (es decir, const HOST = 'my.domain.com';)
c) y agregue sockets en la línea 37 de app.js (es decir, 'socket.sockets.on (' conexión ', función (cliente) {…')
fuente
Actualización al código:
ahora renombrado a
ver guía de migración
fuente
según la solución @alex . si tiene un error como este según la mención de @tyler :
entonces necesitas instalar Redis primero. mira esto:
fuente