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

Gar*_*ary 12 mongoose node.js

大家好!

我在下面定义了一个Mongoose模式并注册了一个模型(InventoryItemModel).有没有办法为模式创建自定义构造函数,这样当我从模型中实例化一个对象时,将调用该函数(例如,从数据库加载带有值的对象)?

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();
Run Code Online (Sandbox Code Playgroud)

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

hun*_*tis 14

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

1)使用钩子

模型初始化,验证,保存和删除时会自动触发挂钩.这是"由内而外"的解决方案.你可以在这里查看文档:

2)为模式编写静态创建函数.

静态模型存在于模型对象上,可用于替换创建新模型等功能.如果您的create步骤有额外的逻辑,您可以自己在静态函数中编写它.这是'从外到内'的解决方案:

  • 你如何做到#2(静态创建功能)?在Mongoose指南中似乎没有任何示例,只是添加一个`myschema.static.create`函数似乎没有做任何事情. (2认同)
  • 我也做了`2)`,但我认为该方法不应该命名为`create`,因为它与[Model.create]相撞(http://mongoosejs.com/docs/api.html#model_Model.create) .不确定覆盖方法是否有害,但使用其他名称更安全,我想(比如`make`,`initialize`等) (2认同)

Jor*_*Riv 6

下面是从选项#2的实现@hunterloftis答案.

2)为模式编写静态创建函数.

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

如果要从someSchema创建新模型,而不是

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

做这个

ItemModel.addItem(itemObj, function (err, model) { /* etc */ });
Run Code Online (Sandbox Code Playgroud)