Я пишу управляемое событиями приложение публикации / подписки с помощью NodeJS и Redis. Мне нужен пример того, как уведомлять веб-клиентов при изменении значений данных в Redis.
Я пишу управляемое событиями приложение публикации / подписки с помощью NodeJS и Redis. Мне нужен пример того, как уведомлять веб-клиентов при изменении значений данных в Redis.
Ответы:
использует express , socket.io , node_redis и, наконец, что не менее важно , пример кода из media fire.
Сначала вы должны (если вы еще этого не сделали) установить node.js + npm за 30 секунд (правильный способ, потому что вы НЕ должны запускать npm как 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
После того, как вы установили node + npm, вы должны установить зависимости, выполнив:
npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)
Вы можете скачать полный образец с сайта 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
Лучше всего, если вы запустите google chrome (из-за поддержки веб-сокетов, но не обязательно). Посетите, http://localhost:3000чтобы увидеть образец (в начале вы не видите ничего, кроме PubSubназвания).
Но на publishканале pubsubвы должны увидеть сообщение. Ниже публикуем "Hello world!"в браузере.
publish pubsub "Hello world!"
вот упрощенный пример без стольких зависимостей. Вам все еще нужноnpm install hiredis redis
Узел JavaScript:
var redis = require("redis"),
client = redis.createClient();
client.subscribe("pubsub");
client.on("message", function(channel, message){
console.log(channel + ": " + message);
});
... поместите это в файл pubsub.js и запустите node pubsub.js
в redis-cli:
redis> publish pubsub "Hello Wonky!"
(integer) 1
который должен отображать: pubsub: Hello Wonky!в терминальном рабочем узле! Поздравляю!
Дополнительно 23.04.2013: Я также хочу отметить, что когда клиент подписывается на pub / sub канал, он переходит в режим подписчика и ограничивается командами подписчика. Вам просто нужно создать дополнительные экземпляры клиентов Redis. client1 = redis.createClient(), client2 = redis.createClient()так что один может быть в режиме подписчика, а другой может выдавать обычные команды БД.
pubsub/*просто добавить pв пример: заменить subscibeна psubscribeи messageна pmessage.
Мы пытались понять Redis Publish / Subscribe (« Pub / Sub »), и все существующие примеры были либо устаревшими, либо слишком простыми, либо не имели тестов. Итак, мы написали полный чат в реальном времени, используя Hapi.js + Socket.io + Redis Pub / Sub Example со сквозными тестами !
Компонент Pub / Sub - это всего несколько строк кода node.js: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
Вместо того, чтобы вставлять его сюда ( без какого-либо контекста ), мы рекомендуем вам проверить / попробовать этот пример .
Мы построили его с помощью Hapi.js , но chat.jsфайл отсоединено от Хапи и может легко использоваться с базовым node.js HTTP - сервером или выразить ( и т.д.)
Обрабатывайте ошибки redis, чтобы остановить выход nodejs. Вы можете сделать это, написав;
subcribe.on("error", function(){
//Deal with error
})
Я думаю, что вы получаете исключение, потому что вы используете тот же клиент, который подписан на публикацию сообщений. Создайте отдельный клиент для публикации сообщений, и это может решить вашу проблему.
Проверьте acani-node на GitHub , особенно файл acani-node-server.js . Если эти ссылки не работают, поищите acani-chat-server в общедоступных репозиториях acani на GitHub .
Если вы хотите, чтобы это работало с socket.io 0.7 И внешним веб- сервером, вам нужно изменить (помимо staticProvider -> static):
a) укажите имя домена вместо localhost (например, var socket = io.connect ('http://my.domain.com:3000');) в index.html
б) изменить HOST в app.js (т.е. const HOST = 'my.domain.com';)
c) и добавьте сокеты в строку 37 файла app.js (например, 'socket.sockets.on (' соединение ', функция (клиент) {…')
согласно решению @alex . если у вас есть такая ошибка, как указано в @tyler :
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.
тогда вам нужно сначала установить Redis . Проверь это:
const client = redis.createClient()в корне app.js?