7

我正在使用本文中概述的 typescript 实现猫鼬模型: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.

使用上面链接文章中概述的猫鼬模型时,它是处理子文档的正确方法吗?

4

1 回答 1

0

你可以试试这个包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' } }); 
于 2019-03-16T07:43:38.597 回答