Пользовательская функция конструктора в схеме/моделях 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();
Можно ли добавить какую-либо пользовательскую конструкторскую функцию, чтобы элемент был заполнен из базы данных после создания экземпляра?
Ответы
Ответ 1
В зависимости от направления, которое вы хотите предпринять, вы можете:
1) Используйте "Крючки"
Крюки автоматически запускаются, когда модели инициализируют, проверяют, сохраняют и удаляют.
Это решение "наизнанку".
Вы можете проверить документы здесь:
2) Напишите статическую функцию создания для вашей схемы.
Статика живет на вашем объекте модели и может использоваться для замены таких функций, как создание новой модели. Если у вас есть дополнительная логика для шага create
, вы можете написать ее самостоятельно в статической функции. Это "внешнее" решение:
Ответ 2
Здесь реализована реализация опции # 2 из @hunterloftis
.
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 */ });
Ответ 3
Я сам столкнулся с этой проблемой и написал плагин 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
Здесь repo (он также доступен на npm): https://github.com/IlskenLabs/mongoose-construct
Ответ 4
Вам нужно экспортировать. Вот пример:
import mongoose from "mongoose";
let Schema = mongoose.Schema;
let restaurentSchema = new Schema({
name : String
})
//export
module.exports = mongoose.model("Restaurent", restaurentSchema)