use*_*647 6 variables mongodb node.js express
我想在app.js文件中通过Node-Mongo-Native-Driver打开并初始化数据库,然后将其打开并读取路由.我在app.js中放入以下代码并包装app.gets,以便在打开数据库时使它们可用:
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);
});
Run Code Online (Sandbox Code Playgroud)
当我现在尝试读取index.js路由中的数据库时,我得到了
ReferenceError: products is not defined
Run Code Online (Sandbox Code Playgroud)
我认为index.js应该能够访问产品,因为它是在外部函数中定义的,因为在初始化中包装app.gets.
除了第二个问题:MongoClient.open和MongoClient.connect之间有什么区别
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`
});
Run Code Online (Sandbox Code Playgroud)
函数不会成为闭包(不保留其封闭函数的值),除非它是在闭包内部的词法(书面).
但是,您可能不希望将整个应用程序编写为一个大关闭.相反,您可以使用exports和require来访问您的产品集合.例如,在名为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; }
};
Run Code Online (Sandbox Code Playgroud)
然后在index.js文件中:
var products = require('mongoconnect').getProducts();
Run Code Online (Sandbox Code Playgroud)
另一种选择(如果你想保持app和index)是使用一对闭包:
index.js:
module.exports = function(products) {
return function index(req, res, next) {
console.log(products); // will have closed-over scope now
};
};
Run Code Online (Sandbox Code Playgroud)
app.js,里面mongoClient.open()
,products
定义的地方:
var index = require('./index')(products);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2393 次 |
最近记录: |