tutorial principiantes para node libro examples ejemplos javascript node.js redis

javascript - principiantes - node js examples



¿Cómo se usa redis PUBLISH/SUBSCRIBE con nodejs para notificar a los clientes cuando cambian los valores de los datos? (8)

Estoy escribiendo una aplicación de publicación / suscripción dirigida por eventos con NodeJS y Redis. Necesito un ejemplo de cómo notificar a los clientes web cuando cambien los valores de los datos en Redis.


VIEJO solo usa una referencia

Dependencias

usa express , socket.io , node_redis y, por último pero no por ello menos importante, el código de ejemplo de media fire.

Instalar node.js + npm (como no root)

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

Instalar dependencias

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 :)

Descargar muestra

Puede descargar una muestra completa de mediafire .

Descomprimir el paquete

unzip pbsb.zip # can also do via graphical interface if you prefer.

Lo que hay adentro 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>

Inicie el servidor

cd pbsb node app.js

Iniciar navegador

Es mejor si inicia google chrome (debido al soporte de websockets, pero no es necesario). Visita http://localhost:3000 para ver una muestra (al principio no ves nada más que PubSub como título).

Pero al publish en el canal pubsub debería ver un mensaje. A continuación publicamos "Hello world!" al navegador.

Desde ./redis-cli

publish pubsub "Hello world!"


Complete Redis Pub / Sub Example ( Chat en tiempo real usando 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 completo en tiempo real usando Hapi.js + Socket.io + Pub / Sub ejemplo de Redis con pruebas de extremo a extremo !

https://github.com/dwyl/hapi-socketio-redis-chat-example

El componente Pub / Sub es solo unas pocas líneas del 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 ) te recomendamos que hagas el checkout / prueba el ejemplo .

Lo construimos utilizando Hapi.js pero el archivo chat.js se chat.js de Hapi y se puede usar fácilmente con un servidor http básico node.js o express (etc.)




Maneje los errores de redis para evitar que nodejs salga. Puedes hacer esto escribiendo;

subcribe.on("error", function(){ //Deal with error })

Creo que obtienes la excepción porque estás utilizando el mismo cliente que está suscrito para publicar mensajes. Cree un cliente separado para publicar mensajes y eso podría resolver su problema.


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) proporcione 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 conectores en la línea 37 de app.js (es decir, ''socket.sockets.on ('' connection '', function (client) {...'')


aquí hay un ejemplo simplificado sin tantas dependencias. Aún necesitas npm install hiredis redis

El nodo JavaScript:

var redis = require("redis"), client = redis.createClient(); client.subscribe("pubsub"); client.on("message", function(channel, message){ console.log(channel + ": " + message); });

... poner eso en un archivo pubsub.js y ejecutar el node pubsub.js

en redis-cli:

redis> publish pubsub "Hello Wonky!" (integer) 1

que debería mostrar: pubsub: Hello Wonky! en el nodo de ejecución de la terminal! Felicidades!

Adicional 23/04/2013: También quiero hacer notar que cuando un cliente se suscribe a un canal pub / sub entra en modo de suscriptor y se limita a los comandos del suscriptor. Solo deberá crear instancias adicionales de clientes redis. client1 = redis.createClient(), client2 = redis.createClient() entonces uno puede estar en modo de suscriptor y el otro puede emitir comandos regulares de DB.


de acuerdo con la solución @alex . si tiene un error como este, como por @tyler mencione:

node.js:134 throw e; // process.nextTick error, or ''error'' event on first tick ^ Error: Redis connection to 127.0.0.1:6379 failed - ECONNREFUSED, Connection refused at Socket.

entonces necesitas instalar Redis primero. mira esto:

Redis