Подтвердить что ты не робот

Пользовательская функция конструктора в схеме/моделях 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();

Можно ли добавить какую-либо пользовательскую конструкторскую функцию, чтобы элемент был заполнен из базы данных после создания экземпляра?

4b9b3361

Ответ 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)