Javascript 在Nodejs中使用数据库引用作为全局变量还是单独的服务模块?
在全局变量中初始化数据库引用是一种好的做法Javascript 在Nodejs中使用数据库引用作为全局变量还是单独的服务模块?,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,在全局变量中初始化数据库引用是一种好的做法 globals.database = client.db(config.dbName); 或者我应该为此创建单独的模块并像这样导出变量吗- exports.globals = { database: null } 并导入控制器- const db= require('./globals').database; exports.postData = function(req, res) { const
globals.database = client.db(config.dbName);
或者我应该为此创建单独的模块并像这样导出变量吗-
exports.globals = {
database: null
}
并导入控制器-
const db= require('./globals').database;
exports.postData = function(req, res) {
const db = globals.database;
我将Node.js与MongoDB本机驱动程序一起使用。因此,我需要访问控制器中的数据库。根据说明,您可以在
index.js
中初始化DB连接,然后将其作为参数传递给需要它的控制器方法
const connection = client.db(config);
const dbAccessLayer = new DbLayer(connection);
const controller = new Controller(dbAccessLayer);
不确定是否更好,但我也使用@Thuvarakan的策略:在这种情况下,您的连接在索引中初始化,传递到DB模块,然后在控制器请求时用于访问DB
const connection = client.db(config);
const dbAccessLayer = new DbLayer(connection);
const controller = new Controller(dbAccessLayer);
控制器的外观类似于:
class Controller {
constructor(dbAccess) {}
insertData(data, cb) {
// Make checks, apply business logic
this.dbAccess.insertData(data, cb);
}
...
}
最后,DB访问层看起来像:
class DbAccess {
constructor(conn) {}
insertData(data, cb) {
conn.insert(...);
}
...
}
最好不要使用全局对象。如果您只需要在控制器中使用DB客户端,请将
client.DB(config.dbName)
作为模块局部变量调用(这仍然假设您在整个模块中都需要它。范围越窄越好)。如果您在其他地方需要它,那么我需要在您的问题中提供更多详细信息。您可以考虑一个访问数据库的标准nodejs API场景,因为我是后端开发新手,我可以猜测我将需要访问index.js(服务器根文件)中的数据库对象,和控制器文件。不要将控制器用于业务逻辑。业务逻辑应该在服务层或数据库访问层。另外,使用连接池来维护DB连接。在这种情况下,您可以在index.js
中初始化DB连接,然后将其作为参数传递给需要它的控制器方法。我也使用@thuva