Создание моделей мангуста с машинописным текстом - вложенные документы

Я занимаюсь реализацией моделей мангуста с машинописным текстом, как описано в этой статье: https://github.com/Appsilon/styleguide/wiki/mongoose-typescript-models, и я не уверен, как это переводится, когда вы работаете с массивами вложенных документов. Допустим, у меня есть следующие определения модели и схемы:

interface IPet {  
    name: {type: mongoose.Types.String, required: true},   
    type: {type: mongoose.Types.String, required: true}   
}

export = IPet


interface IUser {   
    email: string;    
    password: string;   
    displayName: string;   
    pets: mongoose.Types.DocumentArray<IPetModel>   
};

export = IUser;


import mongoose = require("mongoose");  
import IUser = require("../../shared/Users/IUser");   
interface IUserModel extends IUser, mongoose.Document { }

import mongoose = require("mongoose");   
import IPet = require("../../shared/Pets/IPet");   
interface IPetModel extends IPet, Subdocument { }

код, который добавит нового питомца в поддокумент user.pet:

addNewPet = (userId: string, newPet: IPet){
    var _user = mongoose.model<IUserModel>("User", userSchema);
    let userModel: IUserModel = await this._user.findById(userId);
    let pet: IPetModel = userModel.pets.create(newPet);
    let savedUser: IUser = await pet.save();
}

После просмотра ссылки это кажется идеальным подходом, необходимым для обработки вложенных документов. Однако этот сценарий, по-видимому, приводит к возникновению исключения CasterConstructor:

TypeError: Cannot read property 'casterConstructor' of undefined at Array.create.

Это правильный подход к работе с вложенными документами при использовании моделей мангуста, как описано в связанной статье выше?


person user1790300    schedule 12.03.2018    source источник
comment
Раньше я не создавал модель мангуста с машинописным текстом. Я думаю, пусть домашнее животное: IPetModel = userModel.pets.create(newPet); это неверно. Можете ли вы попробовать это решение? addNewPet = (userId: string, newPet: IPet){ var _user = mongoose.model‹IUserModel›(User, userSchema); let userModel: IUserModel = await this._user.findById (userId); userModel.pets.push(newPet); ожидайте userModel.save(); } Надеюсь, поможет   -  person dnp1204    schedule 15.03.2018
comment
Можете ли вы попробовать использовать классы вместо интерфейсов? Это просто догадка, но я знаю, например, в приложениях Angular, что метаданные Typescript (типы и т. д.) не попадают в скомпилированный код, и это включает интерфейсы! Это означает, что мангуст запрашивает конструктор этой вложенной модели. /schema, но не может его найти, так как при компиляции пропал интерфейс.   -  person Zlatko    schedule 22.03.2018


Ответы (1)


вы можете попробовать этот пакет https://www.npmjs.com/package/mongoose-ts-ua

@setSchema()
class User1 extends User {
    @prop()
    name?: string;

    @setMethod
    method1() {
        console.log('method1, user1');
    }
}

@setSchema()
class User2 extends User {
    @prop({ required: true })
    name?: string;

    @prop()
    child: User1;
}

export const User2Model = getModelForClass<User2, typeof User2>(User2);

использование

let u2 = new User2Model({ child: { name: 'u1' } }); 
person aoi umi    schedule 16.03.2019