node.js - Skapa mongoose-modeller med typescript - subdokument
Jag är i färd med att implementera mongoose-modeller med TypeScript enligt denna artikel: https://github.com/Appsilon/styleguide/wiki/mongoose-typescript-models och är inte säker på hur detta översätts när du arbetar med arrayer av subdokument. Låt oss säga att jag har följande modell- och schema-definitioner:
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 { }
kod som skulle lägga till ett nytt husdjur till user.pet underdokumentet:
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();
}
Efter att ha granskat länken verkar detta vara det idealiska tillvägagångssättet som behövs för att hantera underdokument. Dock verkar detta scenario resultera i att ett CasterConstructor-undantag kastas:
TypeError: Cannot read property 'casterConstructor' of undefined at Array.create.
Är det rätt tillvägagångssätt att hantera undermeddelanden när man använder mongoose-modeller som beskrivs i den länkade artikeln ovan?
Svar #1
du kan prova detta paket 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);
användning
let u2 = new User2Model({ child: { name: 'u1' } });
