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