是否可以在Node / Express 4.0中声明全局变量

时间:2014-07-12 22:22:42

标签: javascript node.js express

我有多个需要访问数据库的路由,对于开发我使用本地数据库,显然我使用托管数据库生成

唯一的问题是每次我去推送一个版本我必须通过每条路线手动更改数据库链接

e.g。

var mongodb = require('mongojs').connect('urlhere', ['Collection']);

如果我能在app.js中声明一个变量

那就太好了

app.set('mongoDBAddress', 'urlhere');

然后在每个文件中做类似的事情 var mongodb = require('mongojs').connect(app.get('mongoDBAddress'), ['Collection']);

有人知道这是否可以实现我已经搞乱了大约一个小时谷歌搜索并尝试包含不同的东西,但我没有运气。谢谢。

2 个答案:

答案 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中有两个方法来共享模块中的变量。

  1. 全球
  2. module.export
  3. 但是您的问题似乎有所不同,我得到的是您希望将应用程序连接到不同的数据库而无需更改代码。您需要做的是使用命令行参数

    For more ref

    <强> 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]]
    }