"Global"节点中的模块对象.js



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

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

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

从剧本来看,效果很好。但是,我有一些其他处理路由的脚本,我想在这些脚本上执行一些DB内容,但如果我使用DBConn,它会返回一个错误,说"DBConn未定义"。

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

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

您需要在每个文件中使用()模块。节点将缓存模块。

通常,DB连接的上下文被抽象到存储或存储库后面,您的其他模块与这些模块交互。在人们直接需要mongoose等模块的情况下,他们会在任何地方都需要mongose,但只调用其主要应用程序入口点(app.js/server.js/anthe)内的连接代码。

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

模块在第一次加载后被缓存。这意思是(除其他外)每个需要('o')的电话都会得到完全相同的对象返回,如果它将解析为文件

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

如果要让模块多次执行代码,则导出一个函数,并调用该函数。

您可以使用singleton来为您解决这个问题。然而,请记住,单身人士也有自己的一系列问题(关于单身人士的一个很好的讨论可以在这里找到。单身人士有什么不好的?)。

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

示例:

// 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();

最新更新