Javascript 异步等待和共享MongoDB连接
我目前正在使用Express和MongoDB本机节点构建后端。我一直在研究,试图找到管理Mongo数据库连接并在应用程序中使用该连接的最佳“最佳实践”。 我目前的解决方案是工作,我得到了预期的结果,通过测试邮递员。在处理MongoDB3.x(没有Mongoose)和模块化的连接时,我找不到具体的答案 有人愿意就我当前的解决方案提供一些反馈吗? 我主要担心的是,此设置将无法执行。我怀疑可能不是,可能是因为频繁打开/关闭连接,但我不确定我这样做是好是坏 我创建了一个Javascript 异步等待和共享MongoDB连接,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我目前正在使用Express和MongoDB本机节点构建后端。我一直在研究,试图找到管理Mongo数据库连接并在应用程序中使用该连接的最佳“最佳实践”。 我目前的解决方案是工作,我得到了预期的结果,通过测试邮递员。在处理MongoDB3.x(没有Mongoose)和模块化的连接时,我找不到具体的答案 有人愿意就我当前的解决方案提供一些反馈吗? 我主要担心的是,此设置将无法执行。我怀疑可能不是,可能是因为频繁打开/关闭连接,但我不确定我这样做是好是坏 我创建了一个db.js文件来服务我的连接: c
db.js
文件来服务我的连接:
const assert = require("assert");
const MongoClient = require("mongodb").MongoClient;
const base = process.env.PWD;
const config = require(base + "/config");
let db;
let client;
const connect = async () => {
const url = config.url
const dbName = config.dbName
client = await MongoClient.connect(url)
db = await client.db(dbName)
return db
}
const disconnect = () => {
client.close()
}
module.exports = {
connect: connect,
disconnect: disconnect
}
然后,我在我的todos文件夹的index.js
中为我的“todos”设置路由。按照最佳做法,将所有组件文件放在各自的文件夹中(打开以获得有关文件夹结构的反馈):
最后是实际的todosController.js
,它需要db.js
这是我怀疑会发生一些改进的地方,但我只是不确定。我通过异步功能在路由内连接,等待连接并将其分配给db
我执行CRUD查询(所有查询当前都正常工作),然后在最后断开连接。
如果这被认为是性能和良好的实践,我对这个答案很满意,但如果有一种方法可以更好地使用当前的驱动程序和语法,我会很高兴得到任何反馈
'use strict';
const base = process.env.PWD,
client = require(base + '/db.js'),
assert = require('assert')
let db
const getTodos = async (req, res) => {
db = await client.connect()
const collection = await db.collection('documents')
// Find all todos
collection.find({}).toArray((err, todos) => {
assert.equal(err, null)
res.status(200).json(todos)
})
client.disconnect()
}
似乎这是一种常见的误解,即在每次请求时打开和关闭连接更有效。打开连接很昂贵,这是存在连接池的原因之一。MangGDB支持这些,你应该考虑它们。 关于Express/MongoDB连接处理问题,从以下内容开始: 开发人员在连接到数据库时的一个常见错误是 在每个路由处理程序中调用MongoClient.connect()以获取数据库 连接
我认为我对一个类似问题的回答可能很有用:我喜欢这个解决方案,但在尝试实现时遇到了一些问题。为了使事情模块化,我的项目目前使用服务器的方法。我有一个路由文件,需要控制器进行db查询。使用这种方法,如果我将路由及其功能的使用限制为app.js(或www)和单个文件,以避免像那篇文章所建议的那样需要dbs,那么我可以让一切都正常工作。这似乎使文件变得笨重,模块化程度降低,这种方法有缺点吗?这种方法的要点是已经建立了数据库连接,并通过
require
传递。它最终的行为几乎像一个单例
,因为如果节点已经获得该文件一次,它就不需要再次访问。它实际上与笨重的相反,因为你现在可以自由地索取一次并在任何地方使用它,唯一的价格是单一的require(db)
。哦!!那就更有意义了!我真的很感谢你分享你的初步答案和后续行动。
'use strict';
const base = process.env.PWD,
client = require(base + '/db.js'),
assert = require('assert')
let db
const getTodos = async (req, res) => {
db = await client.connect()
const collection = await db.collection('documents')
// Find all todos
collection.find({}).toArray((err, todos) => {
assert.equal(err, null)
res.status(200).json(todos)
})
client.disconnect()
}