我已經能夠找到的最好的方法是創建一個輔助功能,這樣,這是我然後放入一個單獨的文件:
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var helpers = require("./helpers");
/**
* Dark wizardry function that creates a mongoose schema from a normal JS class
* Objects can also be passed along, and any properties that has methods will be turned into methods on the mongoose Schema.
* @param c The class to creare the schema from
* @param options The additional options to pass to the schema creation
* @returns {Schema} A new mongoose schema for the describing the given class
*/
module.exports = function(c, options) {
var f = null;
// Figure out if f is an object or a function, and take appropriate action
if(helpers.isFunction(c)) {
f = new c();
} else if(typeof f === "object") {
f = c;
} else {
throw new TypeError("Class schema cannot work with that type. Whatever it was you supplied, probably a simple type. ");
}
var prop;
var o = {};
// Save all the properties of f into a new object
for(prop in f) {
var p = f[prop];
switch (p) {
case String:
case Number:
case Date:
case Buffer:
case Boolean:
case mongoose.Types.Mixed:
case mongoose.Types.ObjectId:
case Array:
o[prop] = p;
break;
default:
if(!helpers.isFunction(p)) {
o[prop] = p;
}
}
}
// Create the schema
var sch = new Schema(o, options);
// Create the methods for the schema
for(prop in f) {
if (prop in f) {
var func = f[prop];
switch (func) {
case String:
case Number:
case Date:
case Buffer:
case Boolean:
case mongoose.Types.Mixed:
case mongoose.Types.ObjectId:
case Array:
continue
}
if (helpers.isFunction(func)) {
sch.methods[prop] = func;
}
}
}
return sch;
};
我helpers.js包含isFunction
一個很簡單的功能:
function isFunction(f) {
return typeof f === "function";
}
exports.isFunction = isFunction;
然後,每當我想要一個貓鼬的模式我只是做到以下幾點:
var mongoose = require("mongoose");
var classSchema = require("./class-schema");
var odd = function() {
...
}
odd.prototype.cake = function() {
...
}
var oddSchema = classSchema(odd, {timestamps: true});
module.exports = mongoose.model("Odd", oddSchema);
這將創建一個具有與原始odd
類相同的屬性和相同功能的模型。