"全球" Node.js中的模块对象

时间:2015-11-19 07:35:32

标签: node.js express

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

然后在我的主脚本(app.js)中,我将其实例化为

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

从那个脚本中它运行正常。但后来我得到了一些处理路由的其他脚本,我想在这些脚本上执行一些DB,但是如果我使用DBConn,它会返回一个错误,说" DBConn没有定义"。

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

(顺便说一下:我用Express)

2 个答案:

答案 0 :(得分:2)

您希望在每个文件中要求()您的模块。 Node将缓存模块。

通常,数据库连接的上下文会在商店或存储库后面抽象出来,而您的其他模块会与这些模块进行交互。如果人们直接需要像猫鼬这样的模块,他们会在任何地方都需要猫鼬,但只能在主应用程序入口点内调用连接代码(app.js / server.js / whatever)。

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

  

模块在第一次加载后进行缓存。这个   意味着(除其他事项外)每个要求的呼叫(' foo')都会得到   返回完全相同的对象,如果它将解析为相同   文件。

     

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

     

如果您想让模块多次执行代码,那么导出   一个函数,并调用该函数。

答案 1 :(得分:0)

您可以使用单身人士为您解决此问题。但请记住,单身人士有自己的一系列问题(可以在What is so bad about singletons?找到关于单身人士的好讨论。)

这就是说,一旦你考虑到单身人士的专业和弊端,他们就可以成为这个问题的绝佳解决方案。

示例:

// 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()后,数据库连接就可以使用以下内容:

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

db.DbConnection();