Ist es möglich, Argumente beim Laden eines Moduls mit require zu übergeben?
Ich habe das Modul login.js, das Anmeldefunktionen bietet. Es erfordert eine Datenbankverbindung, und ich möchte, dass in allen meinen Modulen dieselbe Datenbankverbindung verwendet wird. Jetzt exportiere ich eine Funktion login.setDatabase (...), mit der ich eine Datenbankverbindung angeben kann, und das funktioniert einwandfrei. Aber ich würde lieber die Datenbank und andere Anforderungen übergeben, wenn ich das Modul lade.
var db = ...
var login = require("./login.js")(db);
Ich bin ziemlich neu in NodeJS und entwickle normalerweise mit Java und dem Spring Framework, also ja ... das ist eine Konstruktorinjektion :) Ist es möglich, so etwas wie den Code zu machen, den ich oben angegeben habe?
app
Objekt an die erforderlichen Module zu übergeben.Antworten:
Basierend auf Ihren Kommentaren in dieser Antwort mache ich das, was Sie versuchen, so:
Ich strukturiere so ziemlich alle meine Module so. Scheint gut für mich zu funktionieren.
quelle
app
Argument notwendig oder kann ich es weglassen? Mein Modul verwendet dieses App-Argument nicht explizit, aber ich weiß nicht, ob es von node.js für eine interne Sache benötigt wird. Wenn es in Ordnung ist, würde meine Moduldeklaration so aussehen:module.exports = function (db) {
require(mymodule)(myargs)
würde Ihnen ein Modul geben, mit dem Sie arbeiten können. Wenn Sie jedoch von einem anderen Modul auf eine andere Stelle verweisen? Im Basissystem scheint es sich um einen Cache zu handeln, aber in diesem System würde der Cache bei nachfolgenden Aufrufen die Bare-Generator-Methode zurückgebenrequire()
, und wenn Sie Argumente an übergeben, erhaltenrequire()(someargs)
Sie ein anderes Modul zurück ... Vielleicht fehlt es mir etwasvar module;
außerhalb der Exportfunktion, und sobald Sie in die kommen, möchten Sie überprüfen, obmodule
bereits definiert ist, und wenn ja, geben Sie es einfach zurück (und wenn nicht, initialisieren Sie es). Ist das sinnvoll?Ich bin mir nicht sicher, ob dies für Menschen noch nützlich sein wird, aber mit ES6 habe ich eine Möglichkeit, die ich sauber und nützlich finde.
Und dann bekommen Sie Ihr erwartetes Verhalten.
quelle
Ja.
login
Exportieren Sie in Ihrem Modul einfach eine einzelne Funktion,db
deren Argument das Argument ist. Beispielsweise:quelle
module.exports = function(app,db) { ... } module.exports.auth = function(req,res) { ... authentication stuff }
ruft es die "anonyme" Funktion auf und setzt dieapp
unddb
Variablen, aber wenn ich dies tue, findet meine Anwendung dieauth
Funktion nicht. Was mache ich falsch? Wenn ich die anonyme Funktion entferne, wird dieauth
Funktion wieder zugänglich.exports
ist es ein Objekt. Sie können ihm Eigenschaften zuweisen (mehrere Exporte) oder einem Wert zuweisen. Es hört sich so an, als hätten Sie einer Funktion Exporte zugewiesen, dann aber auth als Eigenschaft der Funktion zugewiesen, die Sie Exporten zugewiesen haben. Sie müssten also etwas tun,var auth = require("./login.js").auth
was möglicherweise nicht das ist, was Sie beabsichtigt haben. Wenn Sie das Muster aus der ursprünglichen Frage verwenden möchten, ist es wahrscheinlich am besten, sich an einen einzelnen Exportwert zu halten. Wenn dies immer noch keinen Sinn ergibt, würde ich empfehlen, einen Kern zu veröffentlichen, den ich mir ansehen kann.auth
eine Eigenschaft desexports
Objekts zugewiesen und später in dem Modul, das Sieexports
einer Funktion zugewiesen haben (wodurch die vorherige Zuweisung überschrieben wurde). Wenn Sie die Reihenfolge der Zuordnung umkehren, solltenauth
Sie wie erwartet auf die Funktion zugreifen können . Wieder ist es schwer zu sagen, ohne den Code tatsächlich zu sehen.var login = require('login')
undvar login = require('login')(app)
, aber es gibt einen großen Unterschied, es gibt keine Magie in der zurückgegebenen anonymen Funktion, es ist nur eine andere Funktion / ein anderes Objekt. Anstelle von amodule.exports.auth
gibt die anomymische Funktion jetzt (unter anderem) die Auth-Funktion zurück, dreturn { auth: authFunction, login: loginFunction}
. H. Jetzt funktioniert es also. Vielen Dank.