我正在寻找一些经验丰富的node.js程序员的方向。我遇到的最大问题是将变量传递到单独的模块中。例如,在我的server.js中,我有以下内容:
var db = mongoose.createConnection('localhost','test');
现在我没有在server.js文件中运行我的路由,它们被分成了自己的文件。因此,对于博客示例,它可能是这样的:
app.get('/blog/post/:id',function(req,res){
//do something here
}
现在问题就出现了。我不想在我的每条路线中设置数据库连接,更不用说我会认为它会产生大量的连接。我如何处理这个,是否有一个样本“真实世界”的应用程序,因为我似乎无法找到任何关于这一点,我知道人们之前必须有这个问题。我知道节点缓存了模块,但我无法想象它会缓存连接,因为它在自己的模块中。我创建了一个配置模块,它只保存站点配置,因此需要我需要它的地方不是问题。我想还有其他一些我想做的事情,所以现在最好把它搞清楚。
感谢任何帮助。
答案 0 :(得分:3)
这是我在现实世界中的应用程序。
我有一个名为redis
的模块(这是我正在使用的数据库)。它包含以下代码:
var store;
exports.store = store = redis.createClient(config.port, config.url);
因此,如果需要,我可以直接访问客户端。我几乎从不这样做。同一模块包含如下代码:
exports.getData = function(dataID, callback){
var key = DATA_STORE_PREFIX;
try{
store.hget(key, dataID, callback);
} catch(err){
callback(err);
}
}
我通过将redis
模块包含在一个或多个路由模块中并使用以下方式调用它来使用它:
var db = require('redis');
db.getData('someData', function(err, result){
console.log(result); // real world code goes here!
});
节点模块系统负责其余部分。
答案 1 :(得分:2)
一种方法是将连接添加为对象的属性,该对象将可供所有需要它的模块使用。例如,在我的快递应用程序中,我在我的主应用程序文件中有类似的内容:
require('./config/database')(app);
和config/database
文件如下所示:
var mongoose = require('mongoose');
module.exports = function(app) {
var database = app.get('env');
var uri = database === 'production' ? 'something...' : 'localhost';
return app.locals.db = mongoose.createConnection(uri, database);
};
任何需要数据库连接的模块都可以通过导出一个以app.locals.db
为参数的函数来访问app
(就像上面一样)。当然,如果你使用的不是快递,你需要稍微修改一下,但这个想法仍然是一样的。
答案 2 :(得分:1)
我正在使用快递,我明白了。只是做:
app.set('db', mongoose.createConnection('localhost','test'))
然后在任何模块构造函数中,确保传递app
变量,并且可以使用app.get('db')
让db
起作用。