我有多个需要访问数据库的路由,对于开发我使用本地数据库,显然我使用托管数据库生成
唯一的问题是每次我去推送一个版本我必须通过每条路线手动更改数据库链接
e.g。
var mongodb = require('mongojs').connect('urlhere', ['Collection']);
如果我能在app.js
中声明一个变量
app.set('mongoDBAddress', 'urlhere');
然后在每个文件中做类似的事情
var mongodb = require('mongojs').connect(app.get('mongoDBAddress'), ['Collection']);
有人知道这是否可以实现我已经搞乱了大约一个小时谷歌搜索并尝试包含不同的东西,但我没有运气。谢谢。
答案 0 :(得分:2)
来自docs:
在浏览器中,顶级范围是全局范围。这意味着 在浏览器中,如果您处于全局范围
var something
将定义一个 全局变量。在Node中,这是不同的。顶级范围不是 全球范围; Node模块中的var something
将是本地的 那个模块。
你必须要有所不同。创建模块,而不是创建全局对象,以便它们采用app
实例,例如:
// add.js
module.exports = function(app) { // requires an `app`
return function add(x, y) { // the actual function to export
app.log(x + y) // use dependency
}
}
// index.js
var app = {log: console.log.bind(console)}
var add = require('./add.js')(app) // pass `app` as a dependency
add(1, 2)
//^ will log `3` to the console
这是Express和其他库中的约定。 app
位于您的主文件中(即。index.js
),您需要的模块具有app
参数。
您可以将全局变量添加到GLOBAL
,请参阅此this question,尽管这可能被视为不良做法。
答案 1 :(得分:0)
我们在node.js中有两个方法来共享模块中的变量。
但是您的问题似乎有所不同,我得到的是您希望将应用程序连接到不同的数据库而无需更改代码。您需要做的是使用命令行参数
<强> server.js 强>
var connectTo = {
dev : "url1"
production : "url2"
}
var mongodb = require('mongojs').connect(connectTo[process.argv[2]], ['Collection']);
将您的server.js作为
运行node server.js dev
// for connecting to development database
或
node server.js production
// for connecting to prodiction database
分享不同模块之间的连接
//Method 1
global.mongodb = require('mongojs').connect(connectTo[process.argv[2]], ['Collection']);
//Method 2
exports.mongodb = require('mongojs').connect(connectTo[process.argv[2]], ['Collection']);
exports.getMongoDBAddress = function() {
return connectTo[process.argv[2]]
}