Там заявлена ​​некоторая стандартизация кода в отношении вызовов 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" } );

Что дальше?

Под капотом: управление несколькими моделями

// 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. Опять же, у глобализированных переменных есть свои плюсы и минусы, и нам предлагается использовать разрешения или проверки прав доступа для доступа к некоторым важным переменным / функциям.

Заключение

Стандартизация кода может различаться у разных разработчиков. Однако все мы стремимся к удобству сопровождения и масштабируемости кода. Таким образом, имеет место совместное использование вышеперечисленного! Если это вам немного помогло, обязательно дайте мне знать в комментариях!