In una delle mie funzioni Meteor.publish()
, this.userId
ha il valore di undefined
. Non posso chiamare Meteor.userId()
perché è not available inside a publish function. Come dovresti ottenere userId
adesso?this.userId restituisce un valore non definito all'interno di Meteor.publish
risposta
ci sono quattro possibilità:
nessun utente loggato
si sta chiamando il metodo dal server, e non ci sarà quindi alcun utente associato alla chiamata (. a meno che non sia lo chiami da un'altra funzione che avrà un utente legato al suo ambiente, come un altro metodo o una funzione di iscrizione).
Non è nemmeno installato il pacchetto accounts-base (o uno qualsiasi dei componenti aggiuntivi). Sto solo includendo questo per completezza.
Si sta utilizzando una funzione freccia in ES6.
Meteor.publish('invoices', function() { return invoices.find({by: this.userId}); });
funzionerà correttamente, mentreMeteor.publish('invoices',() => { return invoices.find({by: this.userId}); });
restituirà un cursore vuoto, perchéthis
non avrà la proprietàuserId
. Ciò accade perché una funzione di freccia non associa il propriothis
,arguments
,super
onew.target
.
Se non (2) 'sicuramente, che cosa accade quando si accede Meteor.userId()
immediatamente prima di effettuare la chiamata al metodo sul client?
Utilizzare invece Meteor.userId().
Si dice "Errore: Meteor.userId può essere richiamato solo nelle chiamate di metodo. Utilizzare this.userId nelle funzioni di pubblicazione." –
Meteor.publish ("my_channel", function() { var userId = this.userId; myFunction (userId); }); –
this.userId non è definito –
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;
});
Sì , era 2. Avevo impostato 'var = this.userId' proprio sopra' Meteor.publish', quindi veniva chiamato dal server. Spostarlo all'interno di 'Meteor.publish' lo ha risolto. Grazie! –
Inoltre, per completezza, assicurati di non utilizzare la funzione freccia, ad esempio 'Meteor.publish ('fatture', function() {return invoices.find ({by: this.userId});});' funzionerà bene, mentre 'Meteor.publish ('fatture',() => {restituisce invoices.find ({by: this.userId});});' restituirà il cursore vuoto, perché non avrà userId. Perché una funzione a freccia "non associa questo, argomenti, super o new.target". –
@ElijahSaounkine Grazie! Bit di ES6. – joshperry