Там заявлена некоторая стандартизация кода в отношении вызовов CRUD к Mongo из Node. Вот простая демонстрация схемы и ее операций CRUD, за которой следует предлагаемый подход к стандартизации, а также окончательная реализация. Если вы новичок в node и mongo, возьмите от него как можно больше!
Что можно сделать для стандартизации вызовов CRUD для Mongo в Node.js
Ваш код, ваш стандарт
Node.js?
Node.js набирает популярность благодаря своей эффективности, масштабируемости и поддержке сообщества, помимо того, что он легкий и имеет открытый исходный код. Его кроссплатформенная среда выполнения хорошо подходит для разработки многоплатформенных приложений.
Кроме того, использование неблокирующей модели ввода-вывода помогает повысить надежность результатов в потоковых сервисах и приложениях реального времени. Некоторые технологические гиганты, такие как Netflix, LinkedIn, Trello и PayPal, тоже делают хорошую ставку на его надежность!
MongoDB?
MongoDB, база данных документов, в которой данные хранятся в виде набора документов, а не таблиц с определенной схемой, связанной внешними ключами.
Благодаря высокой масштабируемости и гибкости, различные типы данных можно было без особых проблем хранить и получать к ним доступ с помощью функций запросов и индексации.
Мангуста
Это инструмент моделирования объектов MongoDB, предназначенный для работы в node.js, асинхронной среде выполнения. Кроме того, он прилично поддерживает обещания и обратные вызовы.
npm install mongoose --S
Взгляните на нашу схему модели
Расскажите подробнее о настройке {versionKey: false}.
Документ больше не будет версироваться, и здесь сообщит вам результаты.
Образец CRUD
const Currency = require("../models/Currency");
Создавать:
var data = {name: "United State Dollar", code: "USD", rate: 1} await new Currency(data).save();
Читать:
var code = "USD" var name = "United States Dollar" // Find One await Currency.findOne({ code }) await Currency.findOne({ name, code }); // Find All await Currency.find({}) await Currency.find({}).sort({ createdAt: "desc" });
Обновлять:
var options = { useFindAndModify: false, new: true }; var query = { code: "USD" } var payload = { name: "United States Dollar" } await Currency.findOneAndUpdate(query, payload, options);
Удалить:
await Currency.deleteOne( { "code" : "USD" } );
Что дальше?
- Управление несколькими моделями под одним капотом
- Обработка ошибок для MongoDB
- Далее посмотрим на глобализацию js-переменных.
Под капотом: управление несколькими моделями
// mongo_db_utils.js const moment = require("moment"); /* Models*/ const User = require("../models/User"); const Shop = require("../models/Shop"); const Currency = require("../models/Currency"); const Listing = require("../models/Listing"); const DbModel = { User: User, Shop: Shop, Listing: Listing, Currency: Currency }; const mod_db = { dbGetAll: async function(table, params) { return params ? await DbModel[table].find(params).sort({ createdAt: "desc" }) : await DbModel[table].find({}).sort({ createdAt: "desc" }); }, dbGet: async function(table, key) { return await DbModel[table].findById(key); }, dbGetOne: async function(table, params) { return await DbModel[table].findOne(params); }, dbCreate: async function(table, params) { return await new DbModel[table](params).save(); }, dbUpdate: async function(params) { const options = { useFindAndModify: false, new: true }; const { table, query, payload } = params; return await DbModel[table].findOneAndUpdate(query,payload,options); } }; module.exports = mod_db;
Пример использования:
dbGetOne импортируется из нашего модуля mod_db, как показано выше, и загружается с названиями моделей и полезная нагрузка соответственно.
const db = require("./helper/mongo_db_utils"); ... ... await db.dbGetOne("Currency", { code }); await db.dbGetOne("User", { name }); await db.dbGetOne("Listing", { id });
Обработка ошибок при создании и обновлении MongoDB
const errorHandler = (mongoError) => { let computedErrors = []; if (!is_empty(mongoError["reason"])) { const { kind, value, path } = mongoError; computedErrors.push(`Field: ${path}, expected *${kind}*; receive'${value}'`); } if (!is_empty(mongoError["errors"])) { for (var field in mongoError["errors"]) { const { message, kind, path, value } = mongoError["errors"][field]; computedErrors.push(`${message} (Field: ${path}, expected *${kind}*; receive '${value})'`); } } return computedErrors.join(", ") } ... ... const mod_db = { ... ... dbCreate: async function(table, params) { let err = await new DbModel[table](params) .validate() .catch(errors => errors); if (err) { result["error"] = errorHandler(err); } else { result["data"] = await new DbModel[table](params).save(); } return result; }, ... ... }; module.exports = mod_db;
Полное содержание модуля будет примерно таким же, как показано ниже:
Глобализация переменных JavaScript
Легкий модуль JS отлично подходит для работы в проекте. Однако избыточность кода может возникнуть, когда модуль нужен в разных областях проекта, и мы импортируем их вручную каждый раз, когда он нам нужен.
Следующая стандартизация - это обеспечение глобальной доступности функций dbGetAll, dbGetOne, dbCreate и dbUpdate.
Для тех, кто пропустил это, вы можете найти соответствующую статью, объясняющую реализацию глобальных переменных в Node.js. Опять же, у глобализированных переменных есть свои плюсы и минусы, и нам предлагается использовать разрешения или проверки прав доступа для доступа к некоторым важным переменным / функциям.
Заключение
Стандартизация кода может различаться у разных разработчиков. Однако все мы стремимся к удобству сопровождения и масштабируемости кода. Таким образом, имеет место совместное использование вышеперечисленного! Если это вам немного помогло, обязательно дайте мне знать в комментариях!