首页 文章

在node.js应用程序之间共享MongoDb连接

提问于
浏览
2

我的目标是使用mongodb版本4.0和node.js驱动程序3.1.10使用node.js设置基于express的api .
在目前阶段,我的api部分已基本完成,但最终我的同事将把他们的进展合并到它上面 . 所以我的问题是:
How can I share my connection instance of mongodb to acces it across multiple methods?

我目前的结构是这种类型:

  • app.js服务器调用route.js进行路由管理

  • route.js调用userController.js来管理用户的conecerned方法

  • userController.js,用于管理资源/用户的CRUD操作

在网上搜索结果建议保持连接打开,以便nodejs驱动程序为所有查询管理它,因此我必须公开连接的哪一部分:

  • MongoClient.connect(url) 回调的结果?

  • MongoClient.connect(url) 值本身?

我何时何地打开连接并且必须关闭它?

我知道存在一些类似的问题,但它们已经过时了,并且引用了mongodb api和javscript实现,所以使用回调或等待我如何实现这一点?

1 回答

  • 1

    您必须创建一个模块,该模块导出MongoClient.connect方法创建的连接对象 . 这里的问题是该方法是异步的,所以你必须处理它 . 你有多种选择 . 一种方法可能是这样的:

    database.js

    const MongoClient = require('mongodb').MongoClient
    let url = 'mongodb://xxx'
    let connection
    
    module.exports = function() {
       return new Promise((resolve, reject) => {
          if (connection)
             resolve(connection)
          MongoClient.connect(url, (err, db) => {
             if (err)
                reject(err)
             connection = db
             resolve(connection) 
          })
       })
    }
    

    另一个模块

    var getMongoDbConnection = require('./database.js')
    
    getMongoDbConnection()
    .then((db) => {
        // your connection object
    })
    .catch((e) => {
        // handle err
    })
    
    // or inside an async method
    app.get('/middleware' => async function(req, res, next) => {
        try {
           let db = await getMongoDbConnection()
        } catch (e) {
          // handle
        }
    })
    

相关问题