Рубрики
Без рубрики

Как войти в систему API Node.js в приложении Express.js с плагинами Mongoose

В этом руководстве потребуется предварительное знание реляционного отображения объекта Mongoose (ORM) TechnianceIntRodations Ваше приложение растет, регистрация становится решающей частью для отслеживания всего. Это особенно важно для целей отладки. В наши дни уже существуют модули ввода в НПМ. Эти модули могут хранить журналы в

Автор оригинала: Shailesh Shekhawat.

Вступление

Поскольку ваша заявка растет, регистрация становится решающей частью для отслеживания всего. Это особенно важно для целей отладки.

В наши дни уже существуют модули ввода в НПМ. Эти модули могут хранить журналы в файле в разных форматах или уровнях. Мы собираемся обсудить регистрацию API в своем приложении Node.js Express с помощью популярного Mongoose ORM.

Так как вы создали Монгуст плагин Это сделает регистрацию для вас чистым способом и облегчить регистрацию API?

Что такое плагин в мангусе?

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

Mongoose также предоставляет Глобальные плагины который вы можете использовать для всех схем. Например, мы собираемся написать плагин, который создаст Различать из двух jsons и напишите на Монгодб Отказ

Шаг 1: Создание базовой модели схемы журнала

Давайте создадим базовую схему журнала со следующими шестью свойствами:

  • Действие: Согласно его названию, это будет ход действий API, будь то создать Обновить Удалить или что-то другое.
  • Категория: Категория API. Например, врачи и пациенты. Это больше похоже на класс.
  • Создан: Пользователь, который использует API или ссылается на него.
  • Сообщение: Здесь вы можете включить любое вида сообщение, которое вы хотите показать, что имеют смысл или помочь во время отладки.
  • Различия: Это главное свойство, которое будет иметь Различать из двух Jsons.

Вы можете добавить больше полей, если вы хотите, чтобы это имело смысл для собственного приложения. Схема может быть изменена и модернизирована в соответствии с требованиями.

Вот наша модель: Модели/log.js.

const mongoose = require('mongoose')
const Schema = mongoose.Schema
const { ObjectId } = Schema

const LogSchema = new Schema({
  action: { type: String, required: true },
  category: { type: String, required: true },
  createdBy: { type: ObjectId, ref: 'Account', required: true },
  message: { type: String, required: true },
  diff: { type: Schema.Types.Mixed },
},{
  timestamps: { createdAt: 'createdAt', updatedAt: 'updatedAt' },
})

LogSchema.index({ action: 1, category: 1 })

module.exports = mongoose.model('Log', LogSchema)

Шаг 2: Написать функцию, чтобы получить разницу между 2 jsons

Таким образом, следующим шагом является то, что вам нужна многоразовая функция, которая создаст Различать из двух Джонн на лету.

Давайте назовем это diff.js.

const _ = require('lodash')

exports.getDiff = (curr, prev) => {
  function changes(object, base) {
    return _.transform(object, (result, value, key) => {
      if (!_.isEqual(value, base[key]))
        result[key] = (_.isObject(value) && _.isObject(base[key])) ?                 changes(value, base[key]) : value
    })
 }
 return changes(curr, prev)
}

Я использовал Лоташ , который является популярной библиотекой, чтобы обеспечить ту же функциональность.

Давайте сломаем вышеуказанную функцию и посмотрим, что происходит:

  • _.Трансформ: Это альтернатива .Расмейте для массивов. По сути, это произойдет за счет вашего объекта ключи и Значения Отказ Это обеспечивает Аккумулятор который является первым аргументом. Результат это аккумулятор, и он сметен.
  • _.равно: Выполняет глубокое сравнение между двумя значениями, чтобы определить, есть ли они эквивалентными.

Здесь мы итерация по каждому объекту свойство и ценность и сравнивая его с нашим старым/предыдущим объектом.

Если ценность текущего объекта не равен ценности того же свойства в предыдущем объекте: База [ключ] И если это значение является сам объект, мы называем функцию изменения рекурсивно пока он не получает значение, которое будет наконец сохранено в Результат как Результат [ключ] Отказ

Шаг3: Создайте плагин для использования Diff и сохраните его в базе данных

Теперь нам нужно отслеживать предыдущие документ в базе данных и создать развлекать перед сохранением до монгодб .

const _ = require('lodash')
const LogSchema = require('../models/log')
const { getDiff } = require('../utils/diff')

const plugin = function (schema) {
  schema.post('init', doc => {
    doc._original = doc.toObject({transform: false})
  })
  schema.pre('save', function (next) {
    if (this.isNew) {
      next()
    }else {
      this._diff = getDiff(this, this._original)
      next()
    }
})

  schema.methods.log = function (data)  {
    data.diff = {
      before: this._original,
      after: this._diff,
    }
    return LogSchema.create(data)
  }
}

module.exports = plugin

В мангусе есть разные крючки. На данный момент нам нужно использовать init и Сохранить Методы, доступные на схеме.

this.isnew () : Если вы создаете новый документ, просто верните Далее () промежуточное ПО.

В Schema.post ('init') Toobject () :

doc._original = doc.toObject({transform: false})

Мангуста Модель наследовать от Документ S, которые имеют Toobject () метод. Это преобразует Документ в Объект () и Преобразование: false для не позволяет преобразовывать обратный объект.

Шаг 4: Использование – Как использовать в Apress.js API

В вашем главном server.js или app.js :

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

const mongoose = require('mongoose')

mongoose.plugin(require('./app/utils/diff-plugin'))

Вот основной пример Пользователь Обновите API:

const User = require('../models/user')

exports.updateUser = (req, res, next) => {
  return User.findById(req.params.id)
    .then(user => {
        if (!user)
           throw new Error('Target user does not exist. Failed to update.')
       const { name } = req.body
       if (name) user.name = name
       return user.save()
     })
     .then(result => {
       res.json(result)
       return result
     })
     .catch(next)
     .then(user => {
         if (user && typeof user.log === 'function') { 
            const data = {
              action: 'update-user',
              category: 'users',
              createdBy: req.user.id,
              message: 'Updated user name',
         }
         return user.log(data)
     }
     }).catch(err => {
         console.log('Caught error while logging: ', err)
       })
}

Заключение

В этом руководстве вы узнали, как создать плагин Mongoose и использовать его для регистрации изменения в вашем API. Вы можете сделать намного больше с плагинами для создания надежного узла.

Вот ресурсы, чтобы узнать больше о Mongoose и Usage Plugin:

Я надеюсь, что вы найдете этот учебник полезным, не стесняйтесь добраться до из если у вас есть какие-нибудь вопросы.

Следуйте за Шайлем Шехаватом, чтобы получить уведомление всякий раз, когда я публикую новый пост.

Не стесняйтесь хлопать, если вы считаете это стоящим чтением!

Первоначально опубликовано 101node.io 2 сентября 2018 года.

Оригинал: “https://www.freecodecamp.org/news/how-to-log-a-node-js-api-in-an-express-js-app-with-mongoose-plugins-efe32717b59/”