外掛程式

綱要是可外掛的,也就是說,它們允許應用預先封裝的功能來擴展其功能。這是一個非常強大的功能。

範例

外掛程式是一種在多個綱要中重複使用邏輯的工具。假設您的資料庫中有幾個模型,並且想要為每個模型添加一個 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);

我們剛剛將載入時間行為添加到我們的 GamePlayer 綱要中,並在我們的遊戲的 loadedAt 路徑上宣告一個索引。幾行程式碼就完成了,還不錯吧。

全域外掛程式

想要為所有綱要註冊外掛程式嗎?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 的外掛程式搜尋網站上找到官方支援的外掛程式的完整清單。

社群

您不僅可以在自己的專案中重複使用綱要功能,還可以從 Mongoose 社群中受益。任何發佈到 npm 且以 'mongoose' 作為 npm 關鍵字的外掛程式都會顯示在我們的 搜尋結果頁面上。