In einer meiner Meteor.publish()
Funktionen hat this.userId
den Wert undefined
. Ich kann Meteor.userId()
nicht anrufen, weil es not available inside a publish function ist. Wie soll man jetzt userId
bekommen?this.userId gibt undefined in Meteor.publish zurück
Antwort
Es gibt vier Möglichkeiten:
Es gibt keine Benutzer angemeldet
Sie die Methode vom Server aufrufen, und es wird somit kein Benutzer mit dem Anruf zugeordnet sein (. es sei denn Sie rufen es von einer anderen Funktion an, die einen Benutzer an seine Umgebung gebunden hat, wie eine andere Methode oder eine Subskriptionsfunktion).
Sie haben nicht einmal das accounts-base Paket (oder eines der Add-Ons) installiert. Ich schließe das nur der Vollständigkeit halber mit ein.
Sie verwenden in ES6 eine Pfeilfunktion.
Meteor.publish('invoices', function() { return invoices.find({by: this.userId}); });
wird problemlos funktionieren, währendMeteor.publish('invoices',() => { return invoices.find({by: this.userId}); });
einen leeren Cursor zurückgibt, weilthis
keineuserId
Eigenschaft haben wird. Dies geschieht, weil eine Pfeilfunktion nicht eigenethis
,arguments
,super
odernew.target
bindet.
Wenn es definitiv nicht (2), was passiert, wenn Sie Meteor.userId()
sofort anmelden, bevor Sie den Methodenaufruf auf dem Client zu machen?
Sie sollten stattdessen Meteor.userId() verwenden.
Es heißt "Error: Meteor.userId kann nur in Methodenaufrufen aufgerufen werden. Verwenden Sie this.userId in Publish-Funktionen." –
Meteor.publish ("mein_kanal", funktion() { var userId = this.userId; myFunction (userId); }); –
this.userId ist undefined –
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;
});
Yeah Es war 2. Ich hatte 'var = this.userId' direkt über' Meteor.publish' gesetzt, so dass es vom Server aufgerufen wurde. Das Verschieben in "Meteor.publish" hat es behoben. Vielen Dank! –
Stellen Sie aus Gründen der Vollständigkeit auch sicher, dass Sie keine Pfeilfunktion verwenden, zB 'Meteor.publish ('rechnungen', function() {return invoices.find ({by: this.userId});});' funktioniert gut, während 'Meteor.publish ('rechnungen',() => {return invoices.find ({by: this.userId});});' einen leeren Cursor zurückgibt, da dieser keine userId hat. Weil eine Pfeilfunktion "dies nicht bindet, arguments, super oder new.target". –
@ElijahSaounkine Danke! Bit von der ES6. – joshperry