异步Await和可共享MongoDB连接



我目前正在使用Express和MongoDB Native Node构建后端。我一直在研究,试图找到管理与Mongo数据库的连接并在整个应用程序中使用该连接的最佳"最佳实践"。我目前的解决方案正在运行,我通过Postman中的测试得到了想要的结果。我是在找不到关于处理MongoDB 3.x(没有Mongoose(和模块化连接的具体答案后才想到这一点的。

是否有人愿意对我当前的解决方案提供一些反馈

我主要担心的是这种设置不会有性能。我怀疑可能不是,可能是因为经常打开/关闭连接,但我不确定我的做法是好是坏。

我创建了一个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"设置路由。遵循最佳实践建议,将所有组件文件都放在自己的文件夹中(对文件夹结构的反馈开放(:

const express = require('express'),
base = process.env.PWD,
router = express.Router(),
todos = require(base + '/todos/todosController')
/* GET All Todos */
router.get('/all', todos.getTodos)
/* GET One Todo */
router.get('/todo/:id', todos.getTodo)
/* POST One Todo */
router.post('/todo/:id', todos.addTodo)
/* DELETE One Todo */
router.delete('/todo/:id', todos.deleteTodo)
module.exports = router;

最后是需要db.js的实际todosController.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()
}

这似乎是一种常见的误解,认为在每个请求上打开和关闭连接更有效。打开连接非常昂贵,这也是连接池存在的原因之一。MongoDB支持这些,您应该考虑一下。

下面是一篇关于Express/MongoDB连接处理的文章,它从开始

开发人员在连接到数据库时犯的一个常见错误是在每个路由处理程序中调用MongoClient.connect((以获取数据库联系

最新更新