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

时间:2013-01-08 14:25:43

标签: node.js mongoose

祝贺所有人!

我在下面定义了一个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();

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

5 个答案:

答案 0 :(得分:13)

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

1)使用挂钩

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

2)为您的架构编写静态创建函数。

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

答案 1 :(得分:6)

以下是@hunterloftis的{​​{3}}选项#2的实现。

  

2)为您的架构编写静态创建函数。

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

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

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

这样做

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

答案 2 :(得分:1)

我自己遇到了这个问题并编写了一个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

答案 3 :(得分:0)

@hunterloftis给了我我所需的答案。现在,将近6年后,这是我为其他任何人提供的解决方案。

InventoryItemSchema.static( 'new', function( that )
{
    let instance = new InventoryItemSchema();
    Object.assign( instance, that );
    return instance;
});

或作为单行代码(不利于调试)

InventoryItemSchema.static( 'new', function( that )
{return Object.assign( new InventoryItemSchema(), that );});

无论哪种方式,

let inventoryItem = new InventoryItemSchema({...});

您将拥有

let inventoryItem = InventoryItemSchema.new({...});

答案 4 :(得分:-4)

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

import mongoose from "mongoose";

let  Schema = mongoose.Schema;


let restaurentSchema = new Schema({
  name : String
})

//export

module.exports = mongoose.model("Restaurent", restaurentSchema)