Primus + primus-rooms + sockjs: Как получить всех клиентов, подключенных к комнате

У меня есть сервер primus, который работает на преобразователе sockjs. Я использую плагин primus-rooms для поддержки комнат. Присоединение к комнатам и выход из них проходят успешно, я могу отправлять сообщения клиентам, которые подключены к определенным комнатам.

В какой-то момент мне нужно получить всех подключенных клиентов в определенной комнате. Я хочу использовать это: https://github.com/cayasso/primus-rooms#primusroomroomclientsfn< /а>

primus.room('room').clients(fn);

Но функция fn всегда возвращает значение null, даже если к комнате, на которую я нацеливаюсь, подключены клиенты. Это моя реализация:

var remoteRoom = 'the_room_I_need_to_target';
primus.room(remoteRoom).clients(function(clients){
    console.dir('primus clients in room ' + remoteRoom + ': ' + clients);
});

Нужно ли мне настраивать что-то дополнительно, чтобы запустить это? Я думаю, что мне нужно настроить адаптер для комнат, но я не уверен, что это делает и как это должно быть сделано.


Чтобы быть несколько полным, это моя первоначальная настройка Primus:

var app = require('express')();
var server = require('http').Server(app);
var Primus = require('primus');
var Rooms = require('primus-rooms');
var primus = new Primus(server, {transformer: 'sockjs', pathname: '/primus/my-room'});
primus.plugin('rooms', Rooms);

Я могу успешно присоединяться к комнатам и выходить из них. Присоединение и выход запускаются некоторыми действиями в клиенте:

primus.on('connection', function (spark) {
    spark.on('data', function(data) {

    data = data || {};

    var action = data.action;
    var roomToJoin = data.roomToJoin;

    if ('join' === action) { //join room
        spark.join(roomToJoin, function () {
            logger.debug('primus id ' + spark.id + ' joined room ' + roomToJoin);    
        });
    }else if ('leave' === action) { //leave room
        spark.leave(roomToJoin, function () {
            logger.debug('primus id ' + spark.id + ' left room ' + roomToJoin);

        });
    }
}

person Dries Cleymans    schedule 03.08.2017    source источник


Ответы (1)


Функция обработчика — это fn(ошибка, клиенты), а не fn(клиенты). Изменение кода на следующее привело к ожидаемому поведению:

var remoteRoom = 'the_room_I_need_to_target';
primus.room(remoteRoom).clients(function(error, clients){
    console.dir('primus clients in room ' + remoteRoom + ': ' + clients);
});
person Dries Cleymans    schedule 30.08.2017