В настоящее время я работаю над созданием бэкэнда с использованием 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()
}