133

requireを使用してモジュールをロードするときに引数を渡すことは可能ですか?

ログイン機能を提供するモジュールlogin.jsがあります。データベース接続が必要です。すべてのモジュールで同じデータベース接続を使用したいと思います。ここで、データベース接続を指定できる関数login.setDatabase(...)をエクスポートします。これは、問題なく機能します。ただし、モジュールをロードするときに、データベースやその他の要件を渡すほうがよいでしょう。

var db = ...
var login = require("./login.js")(db);

私はNodeJSにかなり慣れておらず、通常はJavaとSpring Frameworkを使用して開発しているので、そうです...これはコンストラクターインジェクションです:)上記で提供したコードのようなことを行うことは可能ですか?

4

3 に答える 3

250

この回答のあなたのコメントに基づいて、私はあなたがこのようにしようとしていることをします:

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;
};

私はほとんどすべてのモジュールをそのように構成しています。私にとってはうまくいくようです。

于 2012-10-31T17:00:12.797 に答える
50

これがまだ人々に役立つかどうかはわかりませんが、ES6を使用すると、クリーンで便利だと思う方法があります。

class MyClass { 
  constructor ( arg1, arg2, arg3 )
  myFunction1 () {...}
  myFunction2 () {...}
  myFunction3 () {...}
}

module.exports = ( arg1, arg2, arg3 ) => { return new MyClass( arg1,arg2,arg3 ) }

そして、あなたはあなたの期待される行動を得る。

var MyClass = require('/MyClass.js')( arg1, arg2, arg3 )
于 2017-04-14T20:03:25.390 に答える
33

はい。モジュールで、を引数としてlogin取る単一の関数をエクスポートするだけです。db例えば:

module.exports = function(db) {
  ...
};
于 2012-10-31T05:22:58.150 に答える