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?

Author: Andreas Selenwall, 2012-10-31

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.

 191
Author: floatingLomas,
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) {
  ...
};
 29
Author: David Weldon,
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 )
 16
Author: vovkman,
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
 -1
Author: yash sachdeva,
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