2013-06-04 13 views
7

Potrzebuję dodać w czasie rzeczywistym do mojej aplikacji (Ruby On Rails), więc myślę, że lepszym sposobem na to jest użycie node.js + socket .io + redis.node.js + socket.io + redis + rails - Aplikacja RealTime

mam to application.js plik w backend (node.js)

var app = require('http').createServer(); 
var io = require('socket.io'); 
var redis = require('redis').createClient(); 
var _ = require('underscore')._; 

io = io.listen(app); 
io.configure(function() { 
    io.set("transports", ["xhr-polling"]); 
    io.set("polling duration", 10); 
    io.set("close timeout", 10); 
    io.set("log level", 1); 
}) 

redis.subscribe('rt-change'); 

io.on('connection', function(socket) { 
    redis.on('message', function(channel, message) { 
     socket.emit('rt-change', message) 
    }); 
}); 

var port = process.env.PORT || 5001; 
app.listen(port); 

Oraz messages.js w frontend

var socket = io.connect('http://localhost:5001/socket.io'); 
socket.on('rt-change', function (data) { 
    console.log(data); 
}); 

jestem uruchomienie application.js z aplikacji węzła .js polecenia i to działa!

MacBook-Pro-Zhirayr: rt zhirayr $ node application.js info - socket.io rozpoczęła

Ale gdy próbuję wysłać wiadomość z REDiS ($ rt redis.publish” -change ', {hello:' world '}) z aplikacji Rails, moja przeglądarka nie rejestruje niczego w konsoli. Jestem pewien, że to połączenie z przeglądarki zostało ustanowione, ponieważ po zatrzymaniu węzła powoduje odrzucenie błędu połączenia. I jestem pewien, że połączenie między redis a węzłem ustanowione, powoduje, że console.log (message) w application.js loguje go. Ale console.log w przeglądarce nie rejestruje niczego.

Jakieś pomysły, dlaczego?

Dzięki.

UPD do #Antoine

Dodano console.log w application.js io.on ('związek', funkcja (gniazdo) { redis.on ('informacja' funkcja (kanału wiadomości) { console.log ("nowa wiadomość od redis"); socket.emit ("rt-change", wiadomość); }); });

Kiedy r.publish 'rt-change', {: hello => 'świat'} stać wykonany, loguje tego węzła:

new message from redis 
new message from redis 
new message from redis 
new message from redis 
new message from redis 
new message from redis 
new message from redis 
new message from redis 
new message from redis 
new message from redis 
new message from redis 

To dziwne, węzeł loguje 11 razy na 1 wiadomości.

+0

skąd ty Wysyłając wiadomość '$ redis.publish 'rt-Change', {komentarzy: 'Świat' } '? – udidu

+0

Z aplikacji Rails. –

+1

Czy umieścisz dziennik w wywołaniu zwrotnym subskrypcji redis, aby upewnić się, że został uruchomiony? – Antoine

Odpowiedz

11
var socket = io.connect('http://localhost:5001/socket.io'); 
socket.on('rt-change', function (data) { 
    console.log(data); 
}); 

Ta część kodu nie wydaje się prawidłowe, zgodnie z doc na http://socket.io, należy zrobić coś takiego:

<script src="http://localhost:5001/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:5001'); 
</script> 
+0

Rozwiązany sam 10 minut temu, a następnie przeskoczę do stackoverflow, aby zamknąć bilet, a tu jest odpowiedź :) Dzięki i tak. –

5

powód, dla którego są uzyskiwanie wielu egzekucji za pojedynczy publikować wynika z zagnieżdżonej obsługi zdarzeń w kodzie. Spróbuję wyjaśnić to tak prosto, jak tylko mogę.

Po wywołaniu

io.on('connection', function(socket) {...}); 

słuchać za connection imprezy i dodać daną funkcję jak obsługi zdarzeń. Jest wykonywany za każdym razem, gdy łączy się nowy użytkownik. Tworzy to osobny zakres, za każdym razem przy uruchamianiu programu obsługi.

Po wywołaniu tej

io.on('connection', function(socket) { 
    redis.on('message', function(channel, message) { 
     console.log('new message from redis'); 
     socket.emit('rt-change', message); 
    }); 
}); 

dodać słuchaczy na imprezy Redis abonenta message dla każdego z podłączonych użytkowników osobno. To dlatego otrzymujesz wiele dzienników, a użytkownicy podłączeni uzyskują wiele kopii tej samej wiadomości. Masz 11 wiadomości, co oznacza, że ​​w tym czasie było 11 różnych użytkowników.

Aby rozwiązać ten problem, można zadzwonić pod numer once zamiast on dla zdarzeń odsłuchowych. Podobnie jak ten

Dotyczy to również klientów socket.io. Zobacz moje wcześniejsze odpowiedzi, aby uzyskać jasność w tej sprawie:

  1. socket.io code structure: where to place methods?
  2. socket.io creates one more connection after reconnecting
Powiązane problemy