NodeJS ve Redis ile olay odaklı bir yayınlama / abone olma uygulaması yazıyorum. Redis'teki veri değerleri değiştiğinde web istemcilerini nasıl bilgilendireceğime dair bir örneğe ihtiyacım var.
Yanıtlar:
kullanımları ifade , socket.io , node_redis ve son ama en az örnek kod medya ateşten.
Öncelikle (bunu henüz yapmadıysanız) 30 saniyede node.js + npm'yi yüklemelisiniz (doğru yol çünkü npm'yi kök olarak ÇALIŞTIRMAMALISINIZ ):
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
Düğüm + npm'yi kurduktan sonra, aşağıdakileri vererek bağımlılıkları yüklemelisiniz:
npm install express
npm install socket.io
npm install hiredis redis # hiredis to use c binding for redis => FAST :)
Mediafire'dan eksiksiz bir örnek indirebilirsiniz .
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
En iyisi google chrome'u başlatırsanız (websockets desteği nedeniyle, ancak gerekli değildir). http://localhost:3000
Örneği görmek için ziyaret edin (başlangıçta PubSub
başlıktan başka bir şey görmüyorsunuz ).
Ancak publish
kanalda pubsub
bir mesaj görmelisiniz. Aşağıda "Hello world!"
tarayıcıya yayınlıyoruz .
publish pubsub "Hello world!"
İşte bu kadar bağımlılık içermeyen basitleştirilmiş bir örnek. Hala ihtiyacın varnpm install hiredis redis
Düğüm JavaScript:
var redis = require("redis"),
client = redis.createClient();
client.subscribe("pubsub");
client.on("message", function(channel, message){
console.log(channel + ": " + message);
});
... bunu bir pubsub.js dosyasına koyun ve node pubsub.js
redis-cli'de:
redis> publish pubsub "Hello Wonky!"
(integer) 1
görüntülenecek olan: pubsub: Hello Wonky!
terminal çalışan düğümde! Tebrikler!
Ek 4/23/2013: Bir müşteri bir pub / sub kanala abone olduğunda abone moduna girer ve abone komutlarıyla sınırlı olduğunu da belirtmek isterim. Yalnızca ek redis istemcileri örneği oluşturmanız gerekir. client1 = redis.createClient(), client2 = redis.createClient()
böylece biri abone modunda olabilir ve diğeri normal DB komutları verebilir.
pubsub/*
eklemek p
için abone olun : subscibe
ile psubscribe
ve message
ile değiştirin pmessage
.
Redis Yayınla / Abone Ol'u (" Pub / Sub ") anlamaya çalışıyorduk ve mevcut tüm örnekler ya güncelliğini yitirdi, çok basitti ya da hiç testi yoktu. Bu nedenle, Uçtan Uca Testlerle Hapi.js + Socket.io + Redis Pub / Sub Örneğini kullanarak Eksiksiz Gerçek Zamanlı Sohbet yazdık !
Pub / Sub bileşeni yalnızca birkaç satırlık node.js kodudur: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
Buraya yapıştırmak yerine ( herhangi bir bağlam olmadan ) örneği kontrol etmenizi / denemenizi öneririz .
Biz kullanarak inşa Hapi.js ama chat.js
dosyasıdır -de birleştiğinde Hapi gelen edebilir kolayca bir ile kullanılabilir temel node.js http sunucusu veya ekspres (vs)
Nodej'lerin çıkmasını durdurmak için redis hatalarını işleyin. Bunu yazarak yapabilirsiniz;
subcribe.on("error", function(){
//Deal with error
})
Mesajları yayınlamak için abone olan aynı müşteriyi kullandığınız için istisnayı aldığınızı düşünüyorum. Mesajları yayınlamak için ayrı bir müşteri oluşturun ve bu sorununuzu çözebilir.
Check out GitHub'dan acani-düğümü , özellikle dosya acani-düğüm-server.js . Bu bağlantılar koparsa, acani'nin GitHub genel depolarında acani-chat-server'ı arayın .
Bunun socket.io 0.7 VE harici bir web sunucusu ile çalışmasını istiyorsanız, değiştirmeniz gerekir (staticProvider -> statik sorunun yanı sıra):
a) index.html'de localhost (yani var socket = io.connect ('http://my.domain.com:3000');) yerine alan adını sağlayın
b) app.js'de HOST'u değiştirin (yani const HOST = 'alanim.com';)
c) ve app.js'nin 37. satırına soketler ekleyin (ör. 'socket.sockets.on (' bağlantı ', işlev (istemci) {…')
@alex çözümüne göre . @tyler'da belirtildiği gibi bunun gibi bir hatanız varsa :
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.
o zaman önce Redis'i kurmanız gerekir . şuna bir bak:
const client = redis.createClient()
app.js'nin köküne ihtiyacınız var ?