#mongoose #graphql #typegraphql #typegoose
#мангуст #graphql #typegraphql #выбираем тип
Вопрос:
Stack — Type-graphql с Typegoose
Проблема :
- Класс BookRecommendation разрешает книгу (виртуальное поле)
- Typegoose возвращает правильное заполненное значение для book, которое разрешается через BookID foreign ref
- Сериализованный ответ типа graphql не включает объект book, и я перепробовал все способы выяснить это.
Каков правильный способ сериализации объекта book?
@ObjectType()
export class BookRecommendation {
@Field()
readonly _id!: ObjectId;
@prop() @Field(() => Date)
createdAt!: Date;
@prop() @Field(() => Date)
updatedAt!: Date;
@prop() @Field()
sourceUrl!: string;
@prop() @Field()
recommendation!: string;
@prop({ref: Book, }) @Field(type => ObjectIdScalar)
bookId!: Ref<Book>;
@prop({ref: Influencer}) @Field(type => ObjectIdScalar)
influencerId!: Ref<Influencer>;
@prop({
ref: 'Book',
foreignField: '_id', // compare this value to the local document populate is called on
localField: 'bookId', // compare this to the foreign document's value defined in "foreignField",
justOne: true,
})
public book: Book;
}
export const MongooseBookReco = getModelForClass(BookRecommendation, {schemaOptions : {timestamps: true, toObject : { depopulate: false, versionKey: true, virtuals: true, getters: true } }});
// Service Class
@Service() // Dependencies injection
export default class BookRecommendationService {
constructor(private readonly bookRecoModel: BookRecommendationModel) {}
public async getById(_id: ObjectId): Promise<BookRecommendation | null> {
return MongooseBookReco.findById(_id).populate('book').exec();
}
public async find(): Promise<BookRecommendation[]> {
return MongooseBookReco.find().populate('book').exec();
}
public async addBookRecommendation(data: NewBookRecommendationInput): Promise<BookRecommendation> {
const newBookRecommendation = await this.bookRecoModel.create(data);
return newBookRecommendation;
}
}
// Resolver class trying to resolve the
@Query((returns) => BookRecommendation, {name: "BookRecommendation"})
async BookRecommendation(@Arg("id") id: ObjectId) {
const reco = await this.recoService.getById(id);
console.log(reco);
return reco;
}
// Console.log output of reco object above. It contains book
{
_id: 601e3a416f05d67955cf5477,
sourceUrl: 'https://twitter.com/joerogan/status/276827723358404608?s=20',
recommendation: 'Mind blowing book',
bookId: 601e2ebbdda47174163d718d,
influencerId: 601a362796e4c3a3650bcaf6,
__v: 0,
book: {
_id: 601e2ebbdda47174163d718d,
title: 'Sex at dawn',
amazonUrl: 'https://www.amazon.com/dp/0061707813?tag=mostrecommendedbooks-20amp;geniuslink=true',
__v: 0
},
id: '601e3a416f05d67955cf5477'
}
// Client graphl query the trigger above code
query {
BookRecommendation(id: "601e3a416f05d67955cf5477") {
recommendation
_id
bookId
influencerId
}
}
// Graph QL serialized output at client misses book object
{
"data": {
"BookRecommendation": {
"recommendation": "Mind blowing book",
"_id": "601e3a416f05d67955cf5477",
"bookId": "601e2ebbdda47174163d718d",
"influencerId": "601a362796e4c3a3650bcaf6"
}
}
}
Комментарии:
1. вы уже пытались преобразовать свой тип в POJO, прежде чем передавать его в graphql? известно, что mongoose не включает виртуалы в and
.toObject
/.toJSON
call, вы можете активировать это с@modelOptions({ schemaOptions: { toJSON: { virtuals: true }, toObject: { virtuals: true } } })
помощью ordoc.toJSON({ virtuals: true })
2. Привет, спасибо. это все еще ответ graphql, в котором отсутствует виртуальное поле. Да, пробовал
@modelOptions({ schemaOptions: { toJSON: { virtuals: true }, toObject: { virtuals: true } } })
и в классе, и в полеexport const MongooseBookReco = getModelForClass(BookRecommendation, {schemaOptions : {timestamps: true, toObject : { depopulate: false, versionKey: true, virtuals: true, getters: true } }});