6

app.js ファイルで Node-Mongo-Native-Driver を介して DB を開いて初期化し、開いたままにしてルートを読み取ります。次のコードを app.js に配置し、app.gets をラップして、DB を開いたときに使用できるようにします。

var mongoClient = new MongoClient(new Server('localhost', 27017));
mongoClient.open(function(err, mongoClient) {
  var db1 = mongoClient.db("dev-db")
    , products = db1.collection('products');
  app.get('/', routes.index);
  app.get('/users', user.list);
});

index.js ルートで DB を読み込もうとすると、

ReferenceError: products is not defined

初期化でapp.getsをラップするため、index.jsは外部関数で定義されているため、index.jsは製品にアクセスできるはずだと思いました。

2 番目の質問に加えて、MongoClient.open と MongoClient.connect の違いは何ですか

4

1 に答える 1

5

JavaScript はレキシカル スコープを使用します。つまり、これを行うと動作します。

var mongoClient = new MongoClient(new Server('localhost', 27017));
mongoClient.open(function(err, mongoClient) {
  var db1 = mongoClient.db("dev-db")
    , products = db1.collection('products');
  app.get('/', function closedOverIndexRoute(req, res, next) {
    console.log(products); // this will work
  });
  app.get('/users', user.list); // however, user.list will not be able to see `products`
});

関数は、クロージャーの内部で字句的に (書かれている) 場合を除き、クロージャーにはなりません (それを囲んでいる関数の値を保持しません)。

ただし、アプリ全体を 1 つの大きなクロージャとして記述したくないでしょう。代わりに、エクスポートを使用して、商品コレクションへのアクセスを要求することができます。たとえば、mongoconnect.js というファイルでは次のようになります。

var mongoClient = new MongoClient(new Server('localhost', 27017));
var products;

mongoClient.open(function(err, mongoClient) {
  var db1 = mongoClient.db("dev-db");
  products = db1.collection('products');
});

module.exports = {
  getProducts: function() { return products; }
};

次に、index.js ファイルで次のようにします。

var products = require('mongoconnect').getProducts();

別のオプション (アプリとインデックスのみを保持する場合) は、クロージャのペアを使用することです。

index.js:

module.exports = function(products) {
  return function index(req, res, next) {
    console.log(products); // will have closed-over scope now
  };
};

内の app.js で、mongoClient.open()products定義されています。

var index = require('./index')(products);
于 2013-01-29T05:03:25.240 に答える