2014-02-10 2 views
1

Я занимаюсь разработкой простого приложения чата с помощью Node.js и express.ioПодключенные клиентов в express.io

Я хотел бы, чтобы отобразить список подключенных клиентов (или он-лайн для чата) все времени.

В express.io's doc нет четкого способа, как «получить» список подключенных клиентов, как только в комнату войдет новая, т. Е. Есть только «трансляция», но не «получить».

Кто-нибудь сделал это раньше?

Любые подсказки будут действительно полезными.

Спасибо!

Edit:

После попытки @ ответ jibsales'S. Я думаю, что мы почти там. Что клиенты возвращает меня не фактический массив клиентов, но это один:

[ { id: 'OWix3sqoFZAa20NLk304', 
namespace: 
{ manager: [Object], 
    name: '', 
    sockets: [Object], 
    auth: false, 
    flags: [Object], 
    _events: [Object] }, 
manager: 
{ server: [Object], 
    namespaces: [Object], 
    sockets: [Object], 
    _events: [Object], 
    settings: [Object], 
    handshaken: [Object], 
    connected: [Object], 
    open: [Object], 
    closed: [Object], 
    rooms: [Object], 
    roomClients: [Object], 
    oldListeners: [Object], 
    sequenceNumber: 496205112, 
    router: [Object], 
    middleware: [], 
    route: [Function], 
    use: [Function], 
    broadcast: [Function], 
    room: [Function], 
    gc: [Object] }, 
disconnected: false, 
ackPackets: 0, 
acks: {}, 
flags: { endpoint: '', room: '' }, 
readable: true, 
store: { store: [Object], id: 'OWix3sqoFZAa20NLk304', data: {} }, 
_events: 
{ error: [Function], 
    ready: [Function], 
    connection: [Function], 
    NewChatPrivateLine: [Function], 
    NewIdea: [Function], 
    NewChatLine: [Function], 
    NewPost: [Function] } } ] 

функции являются:

var app = require('express.io')(); 
app.io.route('connection', function(req) { 
    req.io.join(req.data.room); 
    var clients = app.io.sockets.clients(req.data.room); 
    console.log(clients) 
    app.io.room(req.data.room).broadcast('announce', { 
    user: req.data.user, 
    clients: clients 
    }) 
}); 

Это фактически возвращает ошибку (данные = JSON.stringify (эв); TypeError: Преобразование круговой структуры в JSON), поскольку массив имеет несколько круглых объектов и, следовательно, не может быть передан.

Любые мысли?

+0

Вы всегда можете просто следить за ними, как они соединяются? – Brad

+0

Я пытался что-то в этом роде, но результат был чрезвычайно сложным для чего-то, что, по-моему, можно было решить более простым и элегантным способом. У вас есть идея кода для отслеживания? – user2988332

ответ

1

Ну, наконец, я пошел с решением «лавирования», предложенным @Brad. Это не самый элегантный, но, если вы можете помочь мне улучшить его, это было бы здорово !!

Это окончательный код:

Серверный

var app = require('express.io')(); 

//To broadcast the users online in room sent by the client 
var clients = []; 
app.io.route('connect', function (req) { 
    req.io.leave(req.data.room).on('disconnect', function() { 
    //To remove client from list when disconnected 
    var index = clients.indexOf(req.data.user); 
    if (index > -1) { 
     clients.splice(index, 1); 
    } 
    app.io.room(req.data.room).broadcast('announce', { 
     user: req.data.user, 
     clients: clients 
    }) 
    }); 
    req.io.join(req.data.room); 
    //To avoid repeating the same client with several opened windows/tabs 
    var index = clients.indexOf(req.data.user); 
    if (index === -1) { 
    clients.push(req.data.user); 
    } 
    app.io.room(req.data.room).broadcast('announce', { 
    user: req.data.user, 
    clients: clients 
    }) 
}); 

стороне клиента

// Emit ready event with person name and predefined room for who's online 
io.emit('connect', { 
    room: room, 
    user: user 
}); 

//Get the signal from server and create your list 
io.on('announce', function (data){ 
//Do awesome stuff with data 
}); 
2

Потому что express.io просто склеивается express и socket.io, не забудьте также посмотреть документацию socket.io. С учетом сказанного, так как socket.io v0.7, теперь у нас есть метод API, чтобы получить эту информацию:

var clients = io.sockets.clients('room'); // all users from room `room` 

К сожалению express.io написано в CoffeeScript (UGGGH !!!), так что я с трудом время чтения источник, но он выглядит, когда вам требуется express.io модуль, то socket.io экземпляр поднимается вверх, а также:

var express = require('express.io'); 
var clients = express.io.sockets.clients('room'); // all users from room `room` 

Если это не работает, я бы канаву express.io для ручной конфигурации с курьерским и розеткой .io потому что он выглядит как express.io имеет ОЧЕНЬ самоуверенный API. Его действительно не так сложно, поскольку express.io делает не что иное, как создание симпатичного интерфейса/абстракции для ручной настройки (что на самом деле вредит вам в этом случае использования, если выше не работает).

Я также проверил бы SockJS, как и я (и многие другие потребители интернет-магазинов), заглушенное socket.io для SockJS из-за отсутствия поддержки сообщества. Не говоря уже о том, что в IE9 наблюдается сильная утечка памяти, когда она возвращается к xhr-опросу.

+0

Привет @jibsales, спасибо. Я пробовал, но он отображает следующее: var clients = req.io.sockets.clients (req.data.room); ^ ТипError: Невозможно вызвать метод «клиенты» неопределенного Я пробовал другие комбинации, например: req.io.room (req.data.room) .clients() без успеха. Любая идея или сайт, где я могу читать дальше? – user2988332

+0

Просмотреть мое обновление =) – srquinn

+0

Обновлены вопросы, любые мысли? Я действительно потерялся сейчас! – user2988332

Смежные вопросы