我的目标是使用mongodb 4.0版和node.js驱动程序3.1.10用node.js设置基于Express的api。
在目前阶段,我的api部分已基本完成,但最终我的同事将把他们的进度合并到该api上。所以我的问题是:
如何共享我的mongodb连接实例以通过多种方法访问它?
我当前的结构是这种类型:
在Web上搜索的结果是建议保持连接开放,以便nodejs驱动程序可以管理所有查询,因此我必须公开连接的哪一部分:
MongoClient.connect(url)
回调的结果吗?MongoClient.connect(url)
值本身是什么?我必须在何时何地打开连接并必须关闭它?
我知道存在一些类似的问题,但是它们很老,并且引用的mongodb api和javscript实现也很老,因此使用回调或等待如何实现这一目标?
答案 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
可以轻松访问它,并且不需要其他模块。