javascript - Använda @nestjs/graphql för att skapa nästlade frågor med @ResolveProperty och @Resolvers
Refererande till type-graphql-exempelrepositoriet i NestJS-repositoriet här undrar jag hur man skapar två lager till djupare i frågan.
För närvarande är det inställt för att fråga recept, jag kunde lägga till en annan @ObjectType-klass
@ObjectType()
export class Author {
@Field(type => Int)
id: number;
@Field({ nullable: true })
firstName?: string;
@Field({ nullable: true })
lastName?: string;
}
och skapade en @ResolveProperty i Recipe Resolver med:
@ResolveProperty('author', type => Author)
async getAuthor(@Parent() recipe) {
console.log('Resolver auth in recipe', recipe);
// This will be a database call, just mocking data for now.
return Promise.resolve({ id: 1, firstName: 'john', lastName: 'smith' });
}
Allt detta fungerar bra (jag skapade också en separat resolver för Författare men det är inte min basfråga så jag inkluderar det inte), med hjälp av denna GraphQL-fråga
{
recipe(id: "1") {
title,
author {
firstName
}
}
}
Denna fråga returnerar
{
"data": {
"recipe": {
"title": "1",
"author": {
"firstName": "john"
}
}
}
}
som det ska. Min fråga nu är hur lägger jag till en annan nivå? Jag försökte skapa en "Publisher" ObjectType
@ObjectType()
export class Publisher {
@Field(type => Int)
id: number;
}
Men ingen kombination av att skapa resolvers eller lägga till ResolveProperty i Author- och Recipe-resolvers fick det att fungera. Var ska jag lägga resolver-koden så att när GraphQL resolvar Author-objektet, så kommer det också att resolva den associerade Publisher-informationen.
Mitt mål är att få det så att en förfrågan såsom:
{
recipe(id: "1") {
title,
author {
firstName,
publisher: {
id
}
}
}
}
skulle återvända
{
"data": {
"recipe": {
"title": "1",
"author": {
"firstName": "jay",
"publisher": {
id: 4
}
}
}
}
}
Inte säker på om jag tänker på det här fel, men det verkar vara en nyckelidé jag saknar för att kunna utveckla det! Tack.
Svar #1
Du skulle i princip bara definiera en AuthorResolver som beskriver hur du skulle "arbeta" med Author. Inom denna AuthorResolver skulle du ha en metod dekorerad med @ResolveProperty för att lösa din publisher-egenskap, så här:
// author.resolver.ts
@ResolveProperty('publisher', type => PublisherObjectType, {})
async resolvePublisher(@Parent() parent: AuthorEntity) {
return parent.getPublisher(); // this method would return your Publisher!
}
Observera att du behöver skapa ditt eget PublisherObjectType (med respektive dekoratörer) och göra det tillgängligt..
