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