Tiny ES2015 class-based wrapper for mongoose model methods.
Note: Since v4.7.0, Mongoose already supports ES2015 classes (PR reference).
$ npm i mongoose mongoose-class-wrapper --save
You can use this plugin with latest Node.js versions (at least v4 LTS) as they support ES2015 class syntax (in strict mode). For previous versions use babel.
// Importing modules
const mongoose = require('mongoose');
const loadClass = require('mongoose-class-wrapper');
// for babel:
// import mongoose from 'mongoose';
// import loadClass from 'mongoose-class-wrapper';
// for typescript:
// import * as mongoose from 'mongoose';
// import loadClass = require('mongoose-class-wrapper');
// Create mongoose schema
var userSchema = new mongoose.Schema({
username: {type: String, unique: true, required: true},
email: {type: String, unique: true, required: true},
hashedPassword: {type: String, required: true},
salt: {type: String, required: true},
created: {type: Date, default: Date.now}
});
// Create new class with model methods
class UserModel {
get password() {
return this._plainPassword;
}
set password(password) {
this._plainPassword = password;
this.salt = Math.random() + '';
this.hashedPassword = this.encryptPassword(password);
}
encryptPassword(password) {
return crypto.createHmac('sha1', this.salt).update(password).digest('hex');
}
static byEmail(email) {
return this.findOne({email}).exec();
}
}
//posible options, for instance if you want to ignore getter and setters put
const options={
ignoreGettersAndSetters:true
}
// Add methods from class to schema
userSchema.plugin(loadClass, {target:UserModel,options:options});
// Export mongoose model
export default mongoose.model('User', userSchema);
import mongoose from 'mongoose';
import loadClass from 'mongoose-class-wrapper';
class Resource {}
// Add schema to base class
Resource.schema = {
version: {
type: Number,
default: 0
}
}
// Add hooks to base class
Resource.hooks = {
pre: {
save: function(next) {
this.version += 1;
next();
}
}
}
var schema = new mongoose.Schema({
title: String,
author: String
});
class Book extends Resource {}
// Add schema, hooks and methods from class to schema
schema.plugin(loadClass, Book);
// Export mongoose model
export default mongoose.model('Book', schema);
Experimental decorators for mongoose models are available in mongoose-decorators package.
This library is under the MIT License