2017-06-04 3 views
0

Im mit FlowRouter mit FlowTemplate und in both/router/router.js Ich bin Überprüfung ist es Benutzer in Rolle admin:Roles.userIsInRole FALSE zurück - Meteor

.... 
action: function() { 
    if(Roles.userIsInRole(Meteor.userId(), 'admin')){ 
     FlowLayout.render('layout', { 
      sidebar: 'sidebar', main:'admin', cart:'cart' 
     }) 
    } else { 
     FlowLayout.render('layout', { 
      sidebar: 'sidebar', main:'unauthorised', cart:'cart' 
     }) 
    } 

    console.log(Meteor.userId()); 

} 
.... 

und gibt FALSE, aber wenn ich es in der Web-Konsole ist TRUE . Diese Zeile console.log(Meteor.userId()); Ausgabe der richtigen userID und wenn ich angemeldet bin, wenn ich dies in der WEB-Konsole Roles.userIsInRole(Meteor.userId(), 'admin') tun, ist es TRUE. Wenn ich diese Meteor.user().roles tun, ist das Ergebnis ['admin']

Wenn ich in der Vorlage überprüfen ist es Benutzer in Rolle:

{{#if isInRole 'admin' }} 
    ADMIN 
{{/if}} 

Es ist TRUE, aber in den router.js kehrt FALSE.

Wie es zu beheben?

Antwort

2

Es ist wahrscheinlich, dass das Feld roles zu einem späteren Zeitpunkt (basierend auf einem anderen Abonnement) empfangen wird.

Sie sollten sicherstellen, dass dieses Abonnement bereit ist - entweder direkt oder mithilfe eines anderen Mechanismus, um sicherzustellen, dass Sie das Feld erhalten (zum Beispiel sicherstellen, dass es ein Array ist), und dann erst das Routing/Rendering Entscheidung.

1

yep, klingt wie die Timing-Probleme, die ich angetroffen habe. 2 Race Conditions musste ich lösen (eine mit AccountsTemplates, die andere mit den Rollen). es ist hier diskutiert:

https://github.com/kadirahq/flow-router/issues/608

hier meine Lösung ist. es geht an der Spitze der routes.js:

import {Tracker} from 'meteor/tracker'; 

if (Meteor.isClient) { 
    FlowRouter.wait(); 

    let tracker; 
    let self = this; 

    self.getATReady =() => AccountsTemplates._initialized; 

    let timer = Meteor.setInterval(function() { 
     if (self.getATReady()) { 
      tracker.invalidate(); 
      clearInterval(timer); 
     } 
    }, 500); 

    tracker = Tracker.autorun(function() { 
     if (!FlowRouter._initialized && Roles.subscription.ready() && self.getATReady()) { 
      clearInterval(timer); 
      FlowRouter.initialize(); 
     } 
    }); 
} 

im Grunde, dieser Code die Initialisierung von FlowRouter verhindert, bis beide die Rollen und AccountsTemplates bereit sind. Sobald beide bereit sind, wird FR initialisiert und Sie können Ihre Routen mit dem Wissen verwenden, dass Sie Rollen überprüfen können.

Ich habe dieses Update seit August 2016, über mehrere Meteor-Versionen, und ich habe das Problem nicht wiederholt.