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

时间:2018-12-08 23:30:13

标签: node.js mongodb async-await

我的目标是使用mongodb 4.0版和node.js驱动程序3.1.10用node.js设置基于Express的api。
在目前阶段,我的api部分已基本完成,但最终我的同事将把他们的进度合并到该api上。所以我的问题是:
如何共享我的mongodb连接实例以通过多种方法访问它?

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

  • 调用route.js进行路由管理的app.js服务器
  • route.js调用userController.js来操纵用户锥化的方法
  • 用于管理资源/ users上的CRUD操作的userController.js

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

  • MongoClient.connect(url)回调的结果吗?
  • MongoClient.connect(url)值本身是什么?

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

我知道存在一些类似的问题,但是它们很老,并且引用的mongodb api和javscript实现也很老,因此使用回调或等待如何实现这一目标?

2 个答案:

答案 0 :(得分: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
    }
})

答案 1 :(得分:1)

您现在不必创建模块。 Express具有内置功能,可在路线之间共享数据。有一个名为app.locals的对象。我们可以将属性附加到它并从我们的路线内部访问它。您只需在app.js文件中实例化mongo连接即可。

var app = express();

MongoClient.connect('mongodb://localhost:27017/')
.then(client =>{
  const db = client.db('your-db');
  const collection = db.collection('your-collection');
  app.locals.collection = collection;
});
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              // view engine setup
app.set('views', path.join(__dirname, 'views'));

现在可以在下面的路由中访问此数据库连接,而无需创建和需要其他模块。

app.get('/', (req, res) => {
  const collection = req.app.locals.collection;
  collection.find({}).toArray()
  .then(response => res.status(200).json(response))
  .catch(error => console.error(error));
});

此方法可确保您在应用程序运行期间一直打开数据库连接,除非您选择随时关闭它。通过req.app.locals.your-collection可以轻松访问它,并且不需要其他模块。