В одной из моих Meteor.publish()
функций this.userId
имеет значение undefined
. Я не могу назвать Meteor.userId()
, потому что недоступен внутри функции публикации. Как вы должны получить userId
сейчас?
This.userId возвращает undefined внутри Meteor.publish
Ответ 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().