3

私はmuduleexpressベースのNodeJSアプリを書いています。これが私のapp.jsの重要な部分です:

var express = require('express')
  , routes = require('./routes')
  , passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;
var app = module.exports = express.createServer();
var ab = 'this is a test!';

// Configuration
app.configure(function(){
  ...

// Routes
app.get('/', routes.index);

app.listen(3000);

Routes.index-コントローラーであり、「/」が要求されたときに実行されます。コードは次のとおりです。

exports.index = function(req, res){

   passport.serializeUser(function(user, done) {
       done(null, user.id);
    });

    ...

  res.render('index.ejs', {
      title: ab
  })
};

技術的には、index.js-は「/routes」フォルダにある別のファイルです。そのため、アプリを起動すると、メインアプリで宣言されているパスポート変数が見つからないためにクラッシュしました。また、abも見つかりませんが、宣言されています。index.jsで変数を再デクレートすると、JSによって新しいオブジェクトが作成されます。アプリのすべてのモジュールで変数を使用するにはどうすればよいですか?SOに関するいくつかのトピックを調べましたが、理解できませんでした。これは一般的な問題ですか、それともアプリの構造が間違っているだけですか。ありがとう!

4

1 に答える 1

4

ご存知のように、あるモジュールで宣言された変数は、他のモジュールに魔法のように現れることはありません。パスポートなどのモジュールに関しては、通常、人々は必要な場所でそれらを再度要求するだけなので、次のようになります。

app.js:

var passport = require('passport'),
    index = require('./routes/index');

index.js:

var passport = require('passport');

ただし、パラメータを渡したい場合もあります。単体テストで行うことがよくあります。依存関係を渡すことができれば、それらの依存関係をモックすることもできます。または、渡すアプリ全体の構成があります。私は通常これを行います:

app.js:

var ab = "foo",
    index = require('/routes/index')(ab);

index.js:

module.exports = function(ab) {
    // Here I have access to ab and can to what I need to do

    return {
        index: function(req, res) { res.send(ab) }
    }
}

他の人々は「シングルトン」パターンを好みます。モジュールが必要になるたびに、モジュールがすでに初期化されているかどうかを確認し、初期化されている場合はそのインスタンスを渡します。

于 2012-07-06T09:06:19.480 に答える