Правильное место для запроса MongoDB в серверном приложении Express API с тестированием? - PullRequest
1 голос
/ 07 марта 2019

Я создаю сервер Node / Express API для использования в качестве бэкэнда для одностраничного приложения React.В настоящее время я использую драйвер MongoDB Node.js (не mongoose) для подключения к моему экземпляру MongoDB.

Мой вопрос: где находится правильное место для хранения запросов MongoDB (insertOne, FindOne и т. Д ...)?Я надеюсь, что кто-то, имеющий опыт работы в производственной команде, сможет дать некоторое представление.

До сих пор мне давали советы от людей с подобным опытом, но, похоже, существует довольно много противоречий.Вот две основные практики, которые я видел:

1.Подключение к MongoDB и запрос внутри функций контроллера.

Мне сказали, что можно подключаться и запрашивать базу данных изнутри функций контроллера.Вот пример того, как это будет выглядеть:

Структура приложения:

├── app.js
├── controllers
│   └── users.js
├── db
│   └── mongodb.js
├── routes
│   └── users.js

Подключение к MonogoDB в нескольких функциях внутри /controllers, повторное использование одного и того же соединения во всем приложении, как рекомендовано.Вот пример /controllers/users.js:

import initMongo from '../db/mongodb';

export const registerUser = (req, res) => {
  initMongo().then((db) => {
    // Register User Code Here
  });
};


export const loginUser = (req, res) => {
  initMongo().then((db) => {
    // Login User Code Here
  });
};

Вот пример `/db/mongodb.js':

import { MongoClient } from 'mongodb';

let cachedDb = null;

/**
 * @description Initialzies the DB instance.
 *
 * @returns {Promise} A resolved promise with the DB instance.
 */
export default () => {
  if (cachedDb && cachedDb.serverConfig.isConnected()) {
    return Promise.resolve(cachedDb);
  }

  return MongoClient.connect(process.env.MONGO_URL, {
    useNewUrlParser: true,
  }).then(client => {
    cachedDb = client.db('databaseName');
    return Promise.resolve(cachedDb);
  });
};

Функции контроллера затем вызываются определенными маршрутами в /routes/users.js, вот так:

router.post('/register', registerUser);
router.post('/login', loginUser);

2.Создайте папку Models и сохраните там все запросы к БД:

Мне также сказали разбивать запросы к БД на папку models и затем ссылаться на запросы оттуда в ваших контроллерах следующим образом:

Структура приложения

├── app.js
├── controllers
│   └── users.js
├── db
│   └── mongodb.js
├── models
│   └── users.js
├── routes
│   └── users.js

Пример /controllers/users.js Файл:

import UserModel from '../models/users';

export const registerUser = (req, res) => {
  const user = new UserModel();
  user.createUser(req.body.user);
};

Пример /models/users.js Файл:

export default function User() {
  this.createUser = (newUser) => {
    // MongoDB insertOne Query
  }
}

Есть ливыгодно ли использовать один из этих методов другого?Есть ли рекомендуемый способ в многопрофильной производственной команде?Я идиот и должен просто использовать Mongoose?

Мне также хотелось бы услышать мнения о том, какой метод будет проще для модульного тестирования на платформе, такой как Jest.

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