Mongoose模式/模型中的自定义构造函数

问候一切!

我如下定义了一个Mongoose模式并注册了一个模型(InventoryItemModel)。 有没有办法为模式创build一个自定义的构造函数,所以当我从模型实例化一个对象,函数将被调用(例如,从数据库加载对象的值)?

var mongoose = require('mongoose') , Schema = mongoose.Schema var InventoryItemSchema = new Schema({ Sku : String , Quanity : Number , Description : String , Carted : [] , CreatedDate : {type : Date, default : Date.now} , ModifiedDate : {type : Date, default : Date.now} }); mongoose.model('InventoryItem', InventoryItemSchema); var item = new InventoryItem(); 

我可以添加一些自定义构造函数,以便在实例化时从数据库填充项目吗?

根据您想要采取的方向,您可以:

1)使用钩子

当模型初始化,validation,保存和移除时,钩子会自动触发。 这是“从内到外”的解决scheme。 你可以在这里查看文档:

2)为你的模式写一个静态创build函数。

静态存在于您的模型对象上,可用于replacefunction,如创build新模型。 如果你的create步骤有额外的逻辑,你可以自己写一个静态函数。 这是“外部”解决scheme:

这是@hunterloftis的答案中的一个选项#2的实现。

2)为你的模式写一个静态创build函数。

 someSchema.statics.addItem = function addItem(item, callback){ //Do stuff (parse item) (new this(parsedItem)).save(callback); } 

当你想从someSchema创build一个新的模型,而不是

 var item = new ItemModel(itemObj); item.save(function (err, model) { /* etc */ }); 

做这个

 ItemModel.addItem(itemObj, function (err, model) { /* etc */ }); 

我自己遇到了这个问题,并写了一个mongoose插件,这将有助于解决您的问题

 var mongoose = require('mongoose') , Schema = mongoose.Schema , construct = require('mongoose-construct') var user = new Schema({}) user.plugin(construct) user.pre('construct', function(next){ console.log('Constructor called...') next() }) var User = mongoose.model('User', user) var myUser = new User(); // construct hook will be called 

这里是回购(它也可在npm上): https : //github.com/IlskenLabs/mongoose-construct

你需要导出。 这里是一个例子:

 import mongoose from "mongoose"; let Schema = mongoose.Schema; let restaurentSchema = new Schema({ name : String }) //export module.exports = mongoose.model("Restaurent", restaurentSchema)