Я создаю сервер 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.