异步等待和可共享的MongoDB连接

时间:2018-11-07 23:17:35

标签: javascript node.js mongodb express

我目前正在使用Express和MongoDB本机节点构建后端。我一直在研究尝试找到最佳的“最佳实践”,以管理与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”设置路线。遵循最佳实践suggestion,将所有组件文件都放在自己的文件夹中(打开以获取有关文件夹结构的反馈):

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;

最后实际需要todosController.js的{​​{1}} 这是我怀疑可能会有所改善的地方,但我不确定。我通过异步功能在路由内进行连接,然后等待连接并将其分配给db.js。我执行CRUD查询(目前所有功能均正常),最后断开连接。 如果这被认为是高性能的,并且是一个很好的实践,那么我对这个答案很满意,但是如果有一种方法可以使用当前的驱动程序和语法更好地做到这一点,那么我将很高兴收到任何反馈。

db

1 个答案:

答案 0 :(得分:1)

这似乎是一个普遍的误解,认为打开和关闭每个请求的连接效率更高。开放的连接很昂贵,这是存在连接池的原因之一。 MongoDB支持这些,您应该考虑它们。

Here is an article关于Express / MongoDB连接处理的主题,该主题立即开始于:

  

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