Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/tarquas/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.
https://github.com/tarquas/mongoose-hook

Last synced: about 2 months ago
JSON representation

Abstract mongoose plugin, allowing usage of 'pre' and 'post' hooks on internal direct wrappers to database API for all (including static) mongoose operations.

Awesome Lists containing this project

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
```shell
git clone [email protected]:tarquas/mongoose-hook.git mongoose-hook
```

# Package
```js
{
"mongoose-hook": "0.1.5"
}
```

# Usage

Example: A plugin to mark every new document with some watermark (uses pre 'insert' hook):

`mongoose-watermark.js`
```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`
```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 in `opts` parameter. The plugin correctly handles the hooking on multiple `mongoose` instances.

* Comparing the code above with the following:

```js
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 of `mongoose.Collection`. Please, refer to `mongoose` manuals for its API. Also, this plugin adds `getModel()` method to `mongoose.Collection` prototype, which returns a `Model` (made by `mongoose.model()`), which refers to given `mongoose.Collection` instance.