Estou escrevendo um aplicativo de publicação / assinatura orientado a eventos com NodeJS e Redis. Preciso de um exemplo de como notificar os clientes da web quando os valores dos dados no Redis mudam.
fonte
Estou escrevendo um aplicativo de publicação / assinatura orientado a eventos com NodeJS e Redis. Preciso de um exemplo de como notificar os clientes da web quando os valores dos dados no Redis mudam.
usa express , socket.io , node_redis e, por último, mas não menos importante, o código de amostra do media fire.
Primeiro você deve (se ainda não fez isso) instalar node.js + npm em 30 segundos (da maneira certa, porque você NÃO deve executar o 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
Depois de instalar o node + npm, você deve instalar as dependências emitindo:
npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)
Você pode baixar uma amostra completa do 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
Melhor se você iniciar o Google Chrome (por causa do suporte para websockets, mas não é necessário). Visite http://localhost:3000
para ver uma amostra (no início você não vê nada além de PubSub
título).
Mas no publish
canal, pubsub
você deve ver uma mensagem. Abaixo publicamos "Hello world!"
no navegador.
publish pubsub "Hello world!"
const client = redis.createClient()
na raiz do app.js?aqui está um exemplo simplificado sem tantas dependências. Você ainda precisa
npm install hiredis redis
O nó JavaScript:
... coloque isso em um arquivo pubsub.js e execute
node pubsub.js
em redis-cli:
que deve exibir:
pubsub: Hello Wonky!
no nó em execução do terminal! Parabéns!Adicional 23/04/2013: Também quero observar que quando um cliente se inscreve em um canal pub / sub, ele entra no modo de assinante e fica limitado a comandos de assinante. Você só precisará criar instâncias adicionais de clientes redis.
client1 = redis.createClient(), client2 = redis.createClient()
portanto, um pode estar no modo de assinante e o outro pode emitir comandos DB regulares.fonte
pubsub/*
apenas adicionarp
ao exemplo: substituasubscibe
porpsubscribe
emessage
porpmessage
.Exemplo completo do Redis Pub / Sub ( bate-papo em tempo real usando Hapi.js e Socket.io)
Estávamos tentando entender a publicação / assinatura do Redis (" Pub / Sub ") e todos os exemplos existentes estavam desatualizados, eram muito simples ou não tinham testes. Então, escrevemos um bate-papo completo em tempo real usando Hapi.js + Socket.io + Exemplo de Redis Pub / Sub com testes ponta a ponta !
O componente Pub / Sub tem apenas algumas linhas de código node.js: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
Em vez de colar aqui ( sem qualquer contexto ), encorajamos você a verificar / experimentar o exemplo .
Nós o construímos usando Hapi.js, mas o
chat.js
arquivo é desacoplado do Hapi e pode ser facilmente usado com um servidor http básico node.js ou expresso (etc.)fonte
Trate os erros do redis para impedir que o nodejs saia. Você pode fazer isso escrevendo;
Acho que você obteve a exceção porque está usando o mesmo cliente que está inscrito para publicar mensagens. Crie um cliente separado para publicar mensagens e isso pode resolver seu problema.
fonte
Verifique acani-node no GitHub , especialmente o arquivo acani-node-server.js . Se esses links forem quebrados, procure acani-chat-server entre os repositórios públicos do GitHub da acani .
fonte
Se você quiser que isso funcione com socket.io 0.7 E um servidor da web externo, você precisa mudar (além do staticProvider -> problema estático):
a) forneça o nome de domínio em vez de localhost (ou seja, var socket = io.connect ('http://my.domain.com:3000');) no index.html
b) alterar HOST em app.js (ou seja, const HOST = 'my.domain.com';)
c) e adicionar sockets na linha 37 do app.js (ou seja, 'socket.sockets.on (' conexão ', função (cliente) {...')
fonte
Atualize para o código:
agora renomeado para
veja o guia de migração
fonte
de acordo com a solução @alex . se você tiver um erro como este conforme a menção de @tyler :
então você precisa instalar o Redis primeiro. Veja isso:
fonte