Автор оригинала: 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:
- Руководство по 80/20 в плагинах Mongoose: http://thecodebarbarian.com/2015/03/06/guide-to-mongoose-plugins.
- https://mongoosejs.com/docs/plugins.html
Я надеюсь, что вы найдете этот учебник полезным, не стесняйтесь добраться до из если у вас есть какие-нибудь вопросы.
Следуйте за Шайлем Шехаватом, чтобы получить уведомление всякий раз, когда я публикую новый пост.
Не стесняйтесь хлопать, если вы считаете это стоящим чтением!
Первоначально опубликовано 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/”