Node.js中的“Global”模块对象

我有一个连接到我的数据库并执行操作的模块。

然后在我的主脚本(app.js)中,我就像实例化它

var DBConn = require('./common/DBConn'); 

从这个脚本,它工作正常。 但是后来我有一些处理路由的其他脚本,我想对这些脚本执行一些数据库操作,但是如果使用DBConn,它会返回一个错误,提示“DBConn未定义”。

然后我可以在这些其他js文件中实例化另一个DBConn,但这意味着我正在为每个文件创build一个连接,对吧? 但是我希望这些其他脚本使用app.js中的DBConn对象,这样我就不会一直build立到DB的连接,然后closures它(除非这是一个好主意,但对我来说更有意义的是只有一个“全局”对象处理所有应用程序的连接,就是这样)。

(顺便说一下:我正在使用Express)

你想在每个文件中需要()你的模块。 节点将caching模块。

通常情况下,数据库连接的上下文被抽象到商店或存储库后面,其他模块与这些模块进行交互。 在人们直接需要像mongoose这样的模块的情况下,他们需要在任何地方使用mongoose,只需要在主应用程序入口点(app.js / server.js / whatever)内调用连接代码即可。

https://nodejs.org/api/modules.html#modules_caching

模块在第一次加载后被caching。 这意味着(除其他外)每个调用require('foo')将返回完全相同的对象,如果它将parsing为相同的文件。

多次调用require('foo')可能不会导致模块代码被多次执行。 这是一个重要的function。 有了它,“部分完成”的对象可以被返回,从而允许传递依赖被加载,即使它们会导致循环。

如果你想要一个模块多次执行代码,那么导出一个函数,然后调用这个函数。

你可以使用一个单例来为你解决这个问题。 请记住,单身人士有自己的一套问题(单身人士可以在这里find一个很好的讨论单身人士有什么不好? )。

这就是说,一旦考虑到了单身人士的利弊,他们可以成为解决这个问题的绝好办法。

例:

 // database.js var singleton = function singleton() { this.DbConnection = {}; function setup(database, username, password) { this.DbConnection = MakeDbConnection() }; }; singleton.instance = null; singleton.getInstance = function(){ if(this.instance === null){ this.instance = new singleton(); } return this.instance; }; module.exports = singleton.getInstance(); 

这可以在你的应用程序的其他地方调用,就像这样…

 // main.js var db = require("./database"); db.setup('db', 'root', 'pass'); db.DbConnection(); 

一旦你第一次调用了db.setup(),db连接将可用,如下所示:

 // elsewhere.js var db = require("./database"); db.DbConnection();