祝贺所有人!
我在下面定义了一个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();
我可以添加一些自定义构造函数,以便在实例化时从数据库中填充该项吗?
答案 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)