This.userId возвращает undefined внутри Meteor.publish

В одной из моих Meteor.publish() функций this.userId имеет значение undefined. Я не могу назвать Meteor.userId(), потому что недоступен внутри функции публикации. Как вы должны получить userId сейчас?

Ответы

Ответ 1

Существует четыре возможности:

  • Пользователь не зарегистрирован.

  • Вы вызываете метод с сервера, и, таким образом, не будет пользователя, связанного с вызовом (если вы не вызываете его из другой функции, которая будет привязана пользователем к своей среде, например, другой метод или функция подписки).

  • У вас даже не установлен пакет учетных записей (или любой из надстроек). Я только включаю это для полноты.

  • В ES6 используется функция стрелок. Meteor.publish('invoices', function() { return invoices.find({by: this.userId}); }); будет работать нормально, а Meteor.publish('invoices', () => { return invoices.find({by: this.userId}); }); вернет пустой курсор, потому что this не будет иметь свойства userId. Это происходит потому, что функция стрелки не связывает собственные this, arguments, super или new.target.

Если это определенно не (2), что происходит, когда вы регистрируете Meteor.userId() непосредственно перед тем, как сделать вызов метода на клиенте?

Ответ 2

FIXED:

import { Meteor } from 'meteor/meteor';
import { Roles } from 'meteor/alanning:roles';
import _ from 'lodash';

import { check } from 'meteor/check';


import Corporations from '../corporations';

Meteor.publish('corporations.list', () => {
  const self = this.Meteor; // <-- see here 
  const userId = self.userId();
  const user = self.user();

  let filters = {};

  if (user) {
    if (!Roles.userIsInRole(userId, ['SuperAdminHolos'])) { // No Está en el Rol SuperAdminHolos
      filters = { adminsEmails: { $in: _.map(user.emails, 'address') } };
    }
    return Corporations.find(filters);
  } else return;
});

Ответ 3

Вместо этого вы должны использовать Meteor.userId().