我有一个模块用于连接我的数据库并执行操作。
然后在我的主脚本(app.js)中,我将其实例化为
var DBConn = require('./common/DBConn');
从那个脚本中它运行正常。但后来我得到了一些处理路由的其他脚本,我想在这些脚本上执行一些DB,但是如果我使用DBConn,它会返回一个错误,说" DBConn没有定义"。
然后我可以在这些其他js文件中实例化另一个DBConn,但这意味着我正在为每个文件创建一个连接,对吧?但我希望这些其他脚本能够使用app.js中的DBConn对象,这样我就不会经常建立与DB的连接然后关闭它......(除非这是一个好主意,但对我来说)只有一个"全局"对象处理所有应用程序及其所有的连接更有意义。
(顺便说一下:我用Express)
答案 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();