Przekazywanie argumentów do require (podczas ładowania modułu)
Czy możliwe jest przekazanie argumentów podczas ładowania modułu za pomocą require?
Mam moduł, login.js, który zapewnia funkcjonalność logowania. Wymaga połączenia z bazą danych i chcę, aby to samo połączenie z bazą danych było używane we wszystkich moich modułach. Teraz eksportuję funkcję login.setDatabase(...), co pozwala mi określić połączenie z bazą danych, i to działa dobrze. Ale wolałbym przekazać bazę danych i wszelkie inne wymagania, gdy Ładuję moduł.
var db = ...
var login = require("./login.js")(db);
Jestem całkiem nowy z NodeJS i zwykle rozwijają się przy użyciu Javy i frameworka Spring, więc tak... to jest Wtrysk konstruktora:) czy można zrobić coś takiego jak kod, który podałem powyżej?
4 answers
Na podstawie Twoich komentarzy w Ta odpowiedź , robię to, co próbujesz zrobić w ten sposób:
module.exports = function (app, db) {
var module = {};
module.auth = function (req, res) {
// This will be available 'outside'.
// Authy stuff that can be used outside...
};
// Other stuff...
module.pickle = function(cucumber, herbs, vinegar) {
// This will be available 'outside'.
// Pickling stuff...
};
function jarThemPickles(pickle, jar) {
// This will be NOT available 'outside'.
// Pickling stuff...
return pickleJar;
};
return module;
};
Układam prawie wszystkie moje Moduły w ten sposób. Wygląda na to, że mi pasuje.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-12 04:32:32
Tak. W module login
po prostu wyeksportuj pojedynczą funkcję, która przyjmuje db
jako swój argument. Na przykład:
module.exports = function(db) {
...
};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-31 05:22:58
Nie jestem pewien, czy to nadal będzie przydatne dla ludzi, ale z ES6 mam na to sposób, który uważam za czysty i przydatny.
class MyClass {
constructor ( arg1, arg2, arg3 )
myFunction1 () {...}
myFunction2 () {...}
myFunction3 () {...}
}
module.exports = ( arg1, arg2, arg3 ) => { return new MyClass( arg1,arg2,arg3 ) }
A potem masz swoje oczekiwane zachowanie.
var MyClass = require('/MyClass.js')( arg1, arg2, arg3 )
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-14 20:03:25
Innym sposobem jest zdefiniowanie najpierw metod, a następnie udostępnienie ich poniżej poprzez 'exports'.(moduł.eksport i eksport odnoszą się do tego samego obiektu)
function kamehameha(name,fame){
}
function bigbangkamehameha(name){
}
exports.kamehameha=kamehameha;
exports.bigbang=bigbangkamehameha; //bigbang refers to bigbangkamehameha
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-29 05:58:52