Ich lerne mean.io von dieses Tutorial-Video , das das Beispielpaket zeigt (erstellt von mean package mymodule
. Es wird auch unter" Pakete "auf Dokumentation ). Ich hätte gerne Hilfe, um zu verstehen, wie die angegebene Authentifizierung / Autorisierung funktioniert.
Das Standard-Beispielpaket / -modul verfügt über eine einfache Benutzerauthentifizierung auf der Clientseite
myapp / packages / mymodule / public / views / index.html enthält:
%Vor%Auf der Serverseite
myapp / packages / mymodule / server / routes / mymodule.js enthält:
%Vor% Die Magie der unterschiedlichen Authentifizierung beruht auf dem zweiten Argument von app.get()
mit einem zusätzlichen Authentifizierungsrückruf : keine, auth.requiresLogin
oder auth.requiresAdmin
.
Dies ist die Authentifizierungszauberei (auch auf github ) ):
myapp / packages / Zugriff / server / config / authorization.js :
%Vor% FRAGE A: Warum ist es "exports.requiresLogin" und "exports.requiresAdmin" in der Datei authorization.js anstatt "somethingselse.requiresLogin" und "somethingselse.requiresAdmin"? Ist das "exports "verwandt mit dem myapp / packages / access / server / config / pass.js s exports
: module.exports = function(passport) { ...}
, github ? Wenn ja, unter welchen Umständen können wir diese "Exporte" nutzen?
Da die Autorisierungsregeln der Authentifizierung im Paket "access" geschrieben und im Paket "mymodule" verwendet werden, sind die Mean.io-Pakete nicht unabhängig voneinander. Das Paket Access
ist auf
myapp / packages / access / app.js , GitHub :
%Vor%FRAGE B: Verbindet Mean.io automatisch alle Pakete oder gibt es Code, um Pakete irgendwo zu verlinken? Ist es aufgrund des Teils mit "Dies ist aus Gründen der Abwärtskompatibilität" unten abgebildet? Wenn ja, wo kann "auth" verwendet werden? Alle Pakete myapp / packages / ? Wie wäre es mit dem mean.io-Basis-App-Verzeichnis myapp / ?
%Vor%FRAGE C: Warum ist es "Access.passport = pass;", sondern "middleware" für "Access.middleware = auth;"? Was passiert, wenn es "Access.auth = auth "?
exports
) In Node.js werden durch das Zuweisen von Werten zum Objekt exports
diese Werte für den Code require
s der Quelldatei verfügbar gemacht.
Zum Beispiel die angegebene Datei foo.js
:
und Datei main.js
:
Das Ausführen von node main.js
gibt foo= FOO ; bar= BAR
aus.
Siehe zum Beispiel die Moduldokumentation zum Knoten oder diese Beschreibung auf require
und exports
.
Die Antwort auf diese Frage ist die Ergänzung zu der Antwort auf Frage A.
Es gibt Code zum "Verknüpfen" der Pakete. Es ist die require
-Anweisung.
In Ihrem app.js
Quellcode setzt die erste Zeile ( var mean = require('meanio')
lesen) die lokale Variable mean
auf die Werte, die exports
Objekt zugewiesen sind, wenn meanio.js
und / oder meanio
Modul ist geladen.
Gleiches gilt für passport = require('passport')
. In diesem Fall entspricht die lokale Variable passport
dem Wert von exports
nach dem Index .js im Pass-Modul wird geladen.
Ich bin mir nicht ganz sicher, was Sie hier fragen, aber lassen Sie mich einen Stich machen.
In diesem Fall:
1) var mean = require('meanio')
in Zeile 1 "importiert" das Meanio-Modul, so dass die lokale Variable mean
mehr oder weniger gleich dem Wert von exports
im Meanio-Modul gesetzt wird.
2) Module = mean.Module
in Zeile 2 setzt die lokale Variable Module
gleich dem Wert von mean.Module
, der im Meanio-Modul zugewiesen sein muss.
3) var Access = new Module('access')
instanziiert eine Instanz der Klasse Module
und weist sie der lokalen Variablen Access
zu.
4) Access.passport = passport
weist der Instanzvariable passport
innerhalb der Instanz von meanio.Module
named Access
(dem Wert von passport
modul require
d in Zeile # 3)
5) Access.middleware = auth
weist der Instanzvariable middleward
innerhalb der Instanz von meanio.Module
benannte Access
(dem von require('./server/config/authorization')
in Zeile 11 zurückgegebenen Wert) zu.
Ich bin nicht vertraut mit dem Modul "mainio", aber basierend auf diesem Code sieht es so aus, als ob Sie die meanio.Module("access")
-Instanz (namens Access
) konfigurieren, indem Sie bestimmte "magische" Variablennamen zuweisen.
Mit anderen Worten, anstatt Access.passport = passport; Access.middleware = auth
könnten Sie Access.setPassport(passport); Access.setMiddleware(auth)
oder (anstatt Zeile 5) var Access = new Module('access',passport,auth)
.
Das heißt, der Autor des "mainio" -Moduls scheint sich dafür entschieden zu haben, spezielle Variablennamen zu verwenden, um die Klasse zu konfigurieren, statt "set" -Methoden oder Parameter, die an den Konstruktor übergeben werden. Ich nehme an, dass irgendwo im Durchschnittskode ein Verweis auf etwas wie this.middleware
und this.passport
steht, wobei der Code davon ausgeht, dass Sie diese Instanzvariablen "ausgefüllt" haben, wie in den letzten Zeilen Ihres Codebeispiels .
Wenn Sie Access.auth = auth
hinzufügen würden, würde nur das Access
-Objekt eine neue attributierte namens auth
haben, deren Wert gleich dem der lokalen Variable ist auth
.
Wenn Sie Access.auth
statt von Access.middleware
verwendet haben, gehe ich davon aus, dass der Code in der Klasse Access
, der this.middleware
verwendet, fehlschlägt, da nein Wert wurde jemals Access.middleware
zugewiesen und Access.auth
ist keiner der "magischen" Variablennamen, nach denen mainio sucht.