2012-10-26 162 views
6

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

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

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

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

现在,这是哪里出了问题进来,我不希望有安装在我的每个路线的数据库连接,何况我想。它会造成很多连接。我如何处理这个问题,是否有一个示例“REAL WORLD”应用程序,因为我似乎无法找到任何关于此的信息,而且我知道以前人们必须遇到此问题。我知道节点缓存模块,但我不能想象它会缓存连接,因为它在它自己的模块中。我创建了一个配置模块,只保存站点配置,因此需要这个我需要它的地方不是问题。我想还有其他的事情,我想要这样做,所以现在最好弄清楚这一点。

任何帮助表示赞赏。

回答

3

这是我在我的真实世界的应用程序做什么。

我有一个名为redis(这是我使用的数据库)模块。它包含以下代码:

var store; 

exports.store = store = redis.createClient(config.port, config.url); 

所以,我可以直接访问客户端,如果需要的话。我几乎从不这样做。相同的模块包含这样的代码:

var db = require('redis'); 

db.getData('someData', function(err, result){ 
    console.log(result); // real world code goes here! 
}); 

的节点模块系统采用的方式:

exports.getData = function(dataID, callback){ 

    var key = DATA_STORE_PREFIX; 

    try{ 
     store.hget(key, dataID, callback); 
    } catch(err){ 
     callback(err); 
    } 
} 

我通过包括在一个或多个路由模块redis模块和主叫它像这样使用该休息。

+0

所以我唯一的问题是这是否创建一个新的连接每次?我已经开始这样做了,但我想确定它没有。 – ngreenwood6

+0

它似乎重用现有的连接,如果它有一个。如果连接在不使用时自动丢弃,则会重新连接。 –

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作为参数的函数(就像上面一样)。当然,如果你使用的不是快递以外的东西,你需要稍微修改一下,但这个想法保持不变。

+0

非常有创意的解决方案,但我认为那种云当地人。这绝对是有用的,虽然自动将数据传递给本地人 – ngreenwood6

+0

我认为这就是'app.locals'。我通过递归自动加载并将应用程序的所有主要组件分配到'app.locals'的属性 - 例如我所有的模型都在'app.locals.models'中。我喜欢这种模式有两个原因:首先,我的模块独立于文件结构工作,也就是说,我不需要在所有地方编写像require('../../ models/user')这样的东西。其次,我的共享库可用于视图 - 例如如果我有'app.locals.lib.urlFor',我可以在视图中将它用作'lib.urlFor'。 –

+0

是的,就像我说的我认为它有它的用途(特别是对于配置或实用程序),但我喜欢能够只需要的数据库。感谢虽然对于输入您提出了一个真正有效的要求 – ngreenwood6

1

您正在使用快递,我明白了。只要做到:

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

然后在任何模块构造,确保传递app变量,你可以使用app.get('db')得到db工作。

+0

感谢您的回复,但我认为其他解决方案更适合。然后我的模块可以更通用,它看起来更干净。 – ngreenwood6