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

Is it possible to declare global variables in Node/Express 4.0

本文关键字:声明 全局变量 Express Node 是否      更新时间:2023-09-26

我有多条需要访问数据库的路由,开发时我使用本地数据库,显然生产时我使用托管数据库

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

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

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

这样的变量就好了

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

则在每个文件中执行如下操作var mongodb = require('mongojs').connect(app.get('mongoDBAddress'), ['Collection']);

有人知道这是可以实现的吗?我已经花了大约一个小时的时间在谷歌上搜索,并试图包括不同的东西,但我没有运气。谢谢。

From the 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添加一个全局变量,参见这个问题,尽管这可能被认为是不好的做法。

在node.js中我们有两个方法来共享模块内的变量。

    全球
  1. module.export

但是你的问题似乎是不同的,我得到的是你想要连接你的应用程序到不同的数据库,而不改变代码。您需要做的是使用命令行参数

查看更多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]]
}