2016-11-27 8 views
1

私はNodeJSとExpressを数日間使ってきました。しかし私は私の周りに頭を上げることができない問題にぶつかったので、私はこれをクリアするのを助けることができる他の誰かが願っています。パラメータ付きExpressJS - ルータモジュール

モジュールを宣言してから、このモジュールにパラメータをrequireメソッドで渡すことができます。

--- App.js ---- 
var foo = require('./modules/Foo.js'); 
    foo.config(); 
var bar= {} 
    require('./modules/Bar.js)(bar, foo) 

--- Bar.js --- 
module.exports = function(Bar, Foo) { 
    Bar.act = function(){ 
      Foo.do(); 
    } 
} 

私は、これはそれを使用して必要となるすべてのモジュールでFooを必要とするよりもずっときれいなデザインだと思います。また、それを必要とする各モジュールで初期化を行う必要もありません。

しかし、その後はRouterとなり、実際の動作は分かりません。そこにほとんどの例外は、各モジュール内のルータを必要とし、このような何か:

--- App.js ---- 
var index = require('./views/index.js'); 
app.use('/', index); 

--- Index.js --- 
var express = require('express'); 
var router = express.Router(); 
var foo = require('../modules/Foo.js); 

foo.config(); 

router.get('/', function (req, res) { 
    foo.do(); 
    res.render('index'); 
}) 

module.exports = router 

しかし、その後、私は手動でindex.jsで使用されるすべてのモジュールを必要とする必要があります。私が本当にやりたいだろうが、このようなものです:

--- App.js ---- 
var foo = require('../modules/Foo.js); 
    foo.config(); 
var index = require('./views/index.js')(foo); 
app.use('/', index); 

--- Index.js --- 
var express = require('express'); 
var router = express.Router(); 

module.exports = function(foo){ 
    router.get('/', function (req, res) { 
     foo.do(); 
     res.render('index'); 
    }) 
} 

しかし、それをこのように書いて、コンパイラは私に語った「Router.use()ミドルウェアを必要とし、未定義のです」。私はこのエラーの原因を調べることができます(module.exportsはオブジェクトを返しません)。しかし、最終的にRouterミドルウェアをエクスポートするモジュールにパラメータを渡すことができるように私のコードをどのように構造化しますか? 1つの場所にFooを要求して初期化し、それを使用するすべてのルータモジュールに渡します。どういうわけか可能ですか?

答えて

1

あなたはほとんどそれを持って、ちょうどRouterを返す必要があります。

var express = require('express'); 

module.exports = function(foo){ 
    var router = express.Router(); 

    router.get('/', function (req, res) { 
     foo.do(); 
     res.render('index'); 
    }); 

    return router; 
} 

お知らせ追加;とリターン:

は、Aはindex.jsは次のようになります固定しました。

また、ルータのインスタンス化を関数に移動しました。ノードモジュールではcachedですが、同じモジュールを複数回要求することができ、それらはすべてグローバル変数を共有します。これにより予期しない結果につながる可能性があります。あなたのケースでは毎回router.getハンドラを上書きし、すべての要求に対して同じインスタンスFooが使用されます。

+1

それは働いた。ありがとうございました^。^ – Gikkman

関連する問題