Асинхронное ожидание и совместное подключение MongoDB - PullRequest
0 голосов
/ 08 ноября 2018

В настоящее время я работаю над созданием бэкэнда с использованием Express и собственного узла MongoDB. Я пытался найти наилучшую «лучшую практику» для управления соединениями с базой данных Mongo и использования этого соединения в приложении. Мое текущее решение работает, и я получаю желаемые результаты с помощью тестов в Почтальоне. Я пришел к этому после того, как не смог найти конкретных ответов по обработке соединений с 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
  }

Затем я установил маршруты для моих «задач» в index.js внутри папки моих задач. Следуя рекомендациям , предлагаем хранить все файлы компонентов в своих собственных папках (открыть для обратной связи по структуре папок):

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, который требует 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()
}

1 Ответ

0 голосов
/ 08 ноября 2018

Кажется, что это распространенное заблуждение, что открытие и закрытие соединения при каждом запросе более эффективно. Открытие соединения стоит дорого, и это одна из причин существования пулов соединений. MongoDB поддерживает их, и вы должны учитывать их.

Вот статья на тему обработки соединений Express / MongoDB, которая начинается сразу с:

Распространенная ошибка, которую допускают разработчики при подключении к базе данных, заключается в вызовите MongoClient.connect () в каждом обработчике маршрута, чтобы получить базу данных подключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...