В одном из моих Meteor.publish()
функций this.userId
имеет значение undefined
. Я не могу позвонить Meteor.userId()
, потому что это not available inside a publish function. Как вы должны получить userId
?this.userId возвращает undefined внутри Meteor.publish
ответ
Есть четыре варианта:
Там не вошли в систему пользователь
Вы вызова метода с сервера, и, таким образом, не будет ни одного пользователя, связанный с вызовом (. , если вы вызываете его из другой функции, которая будет привязана пользователем к своей среде, например, другому методу или функции подписки).
У вас даже нет пакета accounts-base (или каких-либо надстроек). Я только включаю это для полноты.
Вы используете функцию стрелки в 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()
сразу, прежде чем сделать вызов метода на клиенте?
Вместо этого вы должны использовать Meteor.userId().
В нем говорится: «Ошибка: Meteor.userId может быть вызван только вызовом метода. Используйте this.userId в функции публикации». –
Meteor.publish ("my_channel", function() { var userId = this.userId; myFunction (userId); }); –
this.userId не определено –
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;
});
Да , это было 2. Я установил 'var = this.userId' чуть выше' Meteor.publish', поэтому он вызывался с сервера. Перемещение внутри «Meteor.publish» зафиксировало это. Благодаря! –
Кроме того, для полноты, убедитесь, что вы не используете функцию стрелки, то есть 'Meteor.publish ('invoices', function() {return invoices.find ({by: this.userId});});' будет работать очень хорошо, а 'Meteor.publish ('invoices',() => {return invoices.find ({by: this.userId});});' будет возвращать пустой курсор, потому что у этого не будет userId. Потому что функция стрелки «не связывает свои собственные, аргументы, супер или new.target». –
@ElijahSaounkine Спасибо! Бит ES6. – joshperry