Плагины
Схемы являются подключаемыми, то есть они позволяют применять предварительно упакованные возможности для расширения их функциональности. Это очень мощная функция.
Пример
Плагины — это инструмент для повторного использования логики в нескольких схемах. Предположим, у вас есть несколько моделей в вашей базе данных и вы хотите добавить свойство loadedAt к каждой из них. Просто создайте плагин один раз и примените его к каждой Schema:
// loadedAt.js
module.exports = function loadedAtPlugin(schema, options) {
schema.virtual('loadedAt').
get(function() { return this._loadedAt; }).
set(function(v) { this._loadedAt = v; });
schema.post(['find', 'findOne'], function(docs) {
if (!Array.isArray(docs)) {
docs = [docs];
}
const now = new Date();
for (const doc of docs) {
doc.loadedAt = now;
}
});
};
// game-schema.js
const loadedAtPlugin = require('./loadedAt');
const gameSchema = new Schema({ /* ... */ });
gameSchema.plugin(loadedAtPlugin);
// player-schema.js
const loadedAtPlugin = require('./loadedAt');
const playerSchema = new Schema({ /* ... */ });
playerSchema.plugin(loadedAtPlugin);
Мы только что добавили поведение последнего изменения для наших Game и Player схем и объявили индекс по пути lastMod наших игр. Неплохо для нескольких строк кода.
Глобальные плагины
Хотите зарегистрировать плагин для всех схем? Синглтон mongoose имеет функцию .plugin(), которая регистрирует плагин для каждой схемы. Например:
const mongoose = require('mongoose');
mongoose.plugin(require('./loadedAt'));
const gameSchema = new Schema({ /* ... */ });
const playerSchema = new Schema({ /* ... */ });
// `loadedAtPlugin` gets attached to both schemas
const Game = mongoose.model('Game', gameSchema);
const Player = mongoose.model('Player', playerSchema);
Применение плагинов до компиляции моделей
Поскольку многие плагины полагаются на средства промежуточного программного обеспечения, вы должны убедиться, что применяете плагины перед вызовом mongoose.model() или conn.model(). В противном случае, любые средства промежуточного программного обеспечения, которые регистрирует плагин, не будут применены.
// loadedAt.js
module.exports = function loadedAtPlugin(schema, options) {
schema.virtual('loadedAt').
get(function() { return this._loadedAt; }).
set(function(v) { this._loadedAt = v; });
schema.post(['find', 'findOne'], function(docs) {
if (!Array.isArray(docs)) {
docs = [docs];
}
const now = new Date();
for (const doc of docs) {
doc.loadedAt = now;
}
});
};
// game-schema.js
const loadedAtPlugin = require('./loadedAt');
const gameSchema = new Schema({ /* ... */ });
const Game = mongoose.model('Game', gameSchema);
// `find()` and `findOne()` hooks from `loadedAtPlugin()` won't get applied
// because `mongoose.model()` was already called!
gameSchema.plugin(loadedAtPlugin);
Официально поддерживаемые плагины
Команда Mongoose поддерживает несколько плагинов, которые добавляют новые интересные возможности в Mongoose. Вот несколько из них:
-
mongoose-autopopulate: Всегда
populate()определенные поля в ваших схемах Mongoose. -
mongoose-lean-virtuals: Присоединяйте виртуальные поля к результатам запросов Mongoose при использовании
.lean(). - mongoose-cast-aggregation
Полный список официально поддерживаемых плагинов можно найти на сайте поиска плагинов Mongoose.
Сообщество
Вы не только можете повторно использовать функциональность схемы в своих проектах, но также получаете преимущества от сообщества Mongoose. Любой плагин, опубликованный в npm и с «mongoose» в качестве ключа npm, будет отображаться на странице наших результатов поиска.
© 2010 LearnBoost
Licensed under the MIT License.
https://mongoosejs.com/docs/plugins.html