динамические публикации в Meteor на основе роли вошедшего в систему пользователя

Я хотел бы иметь некоторые публикации, которые возвращают только те элементы, к которым пользователь имеет доступ в зависимости от их роли. Я использую пакет alanning:roles для управления ролями.

Например, у меня есть такая публикация:

Meteor.publish('header_fields', function() {
    console.log("header_fields: %j", this.userId);
    if (Roles.userIsInRole(this.userId,['ADMIN','INSPECTOR'])) {
        // Inspectors and Admins can see all header fields
        return HeaderFields.find();
    } else {
        // Clients should only be able to see header fields for forms they have access to
        var user = Meteor.users.find({_id: this.userId});
        var formIds = [];
        _.each(Forms.find({client_id: user.profile.client_id}).fetch(), function(form) {
            this.push(form._id);
        }, formIds);
        return HeaderFields.find({form_id: {$in: formIds}});
    }
});

Проблема, с которой я сталкиваюсь, заключается в том, что во всех примерах, которые я видел, публикации определены в файле .js в папке сервера и, таким образом, запускаются и получаются при первом подключении клиента. Однако пользователь не вошел в систему, когда клиент впервые подключается. Но я не знаю, куда поместить эти публикации или как это должно работать.


person CodeChimp    schedule 03.10.2014    source источник


Ответы (1)


Meteor элегантно обрабатывает этот конкретный вариант использования по умолчанию, цитируя официальные документы:

this.userId

Доступ внутри функции публикации. Идентификатор вошедшего в систему пользователя или null, если пользователь не вошел в систему. Это константа. Однако если вошедший в систему пользователь изменится, функция публикации запустится повторно с новым значением.

http://docs.meteor.com/#publish_userId

Так что в основном это означает, что если вы подписались в клиенте на публикацию, которая возвращает разные документы на основе this.userId, как в вашем примере, все должно работать из коробки!

person saimeunt    schedule 03.10.2014
comment
Да, я только что прочитал это снова и увидел это. Теперь все работает нормально, я только что завернул всю внутренность каждой публикации в файл if (this.userId).... Следующее, что меня смущает, это то, что каждый раз, когда я нажимаю на ссылку, происходит повторный запуск публикаций, как будто пользователь меняется. Не уверен, что это должно произойти. - person CodeChimp; 03.10.2014