Package Exports
- mongoose-hook
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (mongoose-hook) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
mongoose-hook
Abstract mongoose plugin, allowing usage of 'pre' and 'post' hooks on internal direct wrappers to database API for all (including static) mongoose operations.
Installation
git clone git@github.com:tarquas/mongoose-hook.git mongoose-hook
Package
{
"mongoose-hook": "tarquas/mongoose-hook#40df5bac52"
}
Usage
Example: A plugin to mark every new document with some watermark (uses pre 'insert' hook):
mongoose-watermark.js
'use strict';
var
hookPlugin = require('./mongoose-hook'),
thisPlugin = {};
thisPlugin.pre = function(p, callback) {
if (p.insert) {
p.insert[this.watermarkPath] = this.watermarkValue;
}
callback();
};
module.exports = function(schema, opts) {
schema.plugin(hookPlugin, {
mongoose: opts.mongoose,
pre: thisPlugin.pre,
watermarkPath: opts.path || 'watermark',
watermarkValue: opts.value
});
};
Usage of plugin: adds a field to every new document, specifying which process ID created it:
watermark-example.js
var
mongoose = require('mongoose'),
watermarkPlugin = require('./mongoose-watermark');
mongoose.plugin(watermarkPlugin, {
mongoose: mongoose,
path: 'createdByProcess',
value: process.pid
});
Notes
Hook plugin must be provided with an exact instance of
mongoose
, where the processing models expected to be processed inopts
parameter. The plugin correctly handles the hooking on multiplemongoose
instances.Comparing the code above with the following:
schema.post('save', function(next) {
this.createdByProcess = process.pid;
next();
});
The difference is that post 'save' hook is not called for Model.create(...)
method; the post 'insert' hook is called in either case, because mongoose calls underlying insert
wrapper of database API anyway. Also, in example above p.insert
may also refer to $setOnInsert
object on upsert operation.
this
object, which is passed to hook function is an instance ofmongoose.Collection
. Please, refer tomongoose
manuals for its API. Also, this plugin addsgetModel()
method tomongoose.Collection
prototype, which returns aModel
(made bymongoose.model()
), which refers to givenmongoose.Collection
instance.