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..

Relaterade artiklar