2015-01-16 12 views

risposta

63

ci sono quattro possibilità:

  1. nessun utente loggato

  2. 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).

  3. Non è nemmeno installato il pacchetto accounts-base (o uno qualsiasi dei componenti aggiuntivi). Sto solo includendo questo per completezza.

  4. Si sta utilizzando una funzione freccia in ES6. Meteor.publish('invoices', function() { return invoices.find({by: this.userId}); }); funzionerà correttamente, mentre Meteor.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 proprio this, arguments, super o new.target.

Se non (2) 'sicuramente, che cosa accade quando si accede Meteor.userId() immediatamente prima di effettuare la chiamata al metodo sul client?

+0

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! –

+14

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". –

+6

@ElijahSaounkine Grazie! Bit di ES6. – joshperry

-4

Utilizzare invece Meteor.userId().

+0

Si dice "Errore: Meteor.userId può essere richiamato solo nelle chiamate di metodo. Utilizzare this.userId nelle funzioni di pubblicazione." –

+0

Meteor.publish ("my_channel", function() { var userId = this.userId; myFunction (userId); }); –

+0

this.userId non è definito –

-1
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; 
});