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