7

我正在从一些经验丰富的 node.js 程序员那里寻找一些方向。我遇到的最大问题是将变量传递到单独的模块中。例如,在我的 server.js 中,我有以下内容:

var db = mongoose.createConnection('localhost','test');

现在我没有在 server.js 文件中运行我的路由,它们被分成自己的文件。因此,对于博客示例,它可能是这样的:

app.get('/blog/post/:id',function(req,res){
    //do something here
}

现在这就是问题所在。我不想在每条路由中都设置数据库连接,更不用说我认为它会建立大量连接。我该如何处理,那里有一个示例“REAL WORLD”应用程序,因为我似乎找不到任何关于这个的东西,而且我知道人们以前必须遇到这个问题。我知道节点缓存模块,但我无法想象它会缓存连接,因为它位于自己的模块中。我创建了一个仅保存站点配置的配置模块,因此在我需要的地方需要它不是问题。我想我还想做其他事情,所以最好现在就弄清楚。

任何帮助表示赞赏。

4

3 回答 3

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

节点模块系统负责其余的工作。

于 2012-10-26T04:59:13.433 回答
3

一种方法是将连接添加为对象的属性,所有需要它的模块都可以使用该属性。例如,在我的快速应用程序中,我的主应用程序文件中有这样的内容:

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(就像上面一样)。当然,如果您使用的是 express 以外的其他东西,则需要对其进行一些修改,但想法保持不变。

于 2012-10-26T04:51:31.740 回答
1

你正在使用快递,我明白了。做就是了:

app.set('db',  mongoose.createConnection('localhost','test'))

然后在任何模块构造函数中,确保传递app变量,您可以使用app.get('db')它来开始db工作。

于 2012-10-26T08:34:40.417 回答