Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Writing A Mongoose Plug In- plugin() a method?

I am interested in writing a mongoose plug in to make all fields required. I know there are other ways to do this, but I like the idea of writing my own plug in.

From docs http://mongoosejs.com/docs/plugins:

// game-schema.js
var lastMod = require('./lastMod');
var Game = new Schema({ ... });
Game.plugin(lastMod, { index: true });

but when I create a model from my schema and look at the properties, I don't see a plugin() method:

var mongoose = require('mongoose');
var CpuSchema = require("../schemas/cpu");

var Cpu = mongoose.model('Cpu', CpuSchema);
console.log(Cpu);

module.exports = Cpu;

one@demo ~/cloudimageshare-monitoring/project $ node /home/one/cloudimageshare-monitoring/project/app/data/models/cpu.js  
{ [Function: model]
  base: 
   { connections: [ [Object] ],
     plugins: [],
     models: { Cpu: [Circular] },
     modelSchemas: { Cpu: [Object] },
     options: { pluralization: true } },
  modelName: 'Cpu',
  model: [Function: model],
  db: 
   { base: 
      { connections: [Object],
        plugins: [],
        models: [Object],
        modelSchemas: [Object],
        options: [Object] },
     collections: { cpus: [Object] },
     models: {},
     replica: false,
     hosts: null,
     host: null,
     port: null,
     user: null,
     pass: null,
     name: null,
     options: null,
     otherDbs: [],
     _readyState: 0,
     _closeCalled: false,
     _hasOpened: false,
     _listening: false },
  discriminators: undefined,
  schema: 
   { paths: 
      { timeStamp: [Object],
        avaiable: [Object],
        status: [Object],
        metrics: [Object],
        _id: [Object],
        __v: [Object] },
     subpaths: {},
     virtuals: { id: [Object] },
     nested: {},
     inherits: {},
     callQueue: [],
     _indexes: [],
     methods: {},
     statics: {},
     tree: 
      { timeStamp: [Object],
        avaiable: [Function: Boolean],
        status: [Function: String],
        metrics: [Object],
        _id: [Object],
        id: [Object],
        __v: [Function: Number] },
     _requiredpaths: undefined,
     discriminatorMapping: undefined,
     _indexedpaths: undefined,
     options: 
      { id: true,
        noVirtualId: false,
        _id: true,
        noId: false,
        read: null,
        shardKey: null,
        autoIndex: true,
        minimize: true,
        discriminatorKey: '__t',
        versionKey: '__v',
        capped: false,
        bufferCommands: true,
        strict: true,
        pluralization: true },
     _events: {} },
  options: undefined,
  collection: 
   { collection: null,
     opts: { bufferCommands: true, capped: false },
     name: 'cpus',
     conn: 
      { base: [Object],
        collections: [Object],
        models: {},
        replica: false,
        hosts: null,
        host: null,
        port: null,
        user: null,
        pass: null,
        name: null,
        options: null,
        otherDbs: [],
        _readyState: 0,
        _closeCalled: false,
        _hasOpened: false,
        _listening: false },
     queue: [ [Object] ],
     buffer: true } }

Here on the model, I don't see a plugin() method.

like image 502
dman Avatar asked Feb 27 '26 20:02

dman


1 Answers

The plugin method is defined on the Schema class and you can see it on your CpuSchema object. On your Cpu model you can get it by calling

console.log(Cpu.schema.plugin)

From the mongoose source code on GitHub:

/**
* Registers a plugin for this schema.
*
* @param {Function} plugin callback
* @param {Object} opts
* @see plugins
* @api public
*/

Schema.prototype.plugin = function (fn, opts) {
  fn(this, opts);
  return this;
};

When you pass your plugin function to it it simply executes the function and passes the schema reference into it.

like image 116
Christian P Avatar answered Mar 02 '26 10:03

Christian P



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!