【问题标题】:NestJS | GraphQL - How to resolve a list of nested objects from multiple datasets巢穴 | GraphQL - 如何从多个数据集中解析嵌套对象列表
【发布时间】:2020-12-01 09:31:31
【问题描述】:

我正在使用 GraphQL 设置 NestJS 服务,作为 UI 和多个其他服务之间的中间人。在本示例中,我需要显示来自单个出版商的书籍列表及其相关信息。

用户界面将使用发布者 ID 访问嵌套服务。然后我需要调用服务并获取书籍 ID 列表。当我拥有 Id 列表时,我需要访问两个单独的服务,每个服务都返回每个书籍 ID 的对象列表。然后我需要从两个数据集中构建书籍对象列表。

书籍模型的一个例子是:

export class BookModel {

  @Field(type => BookInformationModel)
  bookInfo: BookInformationModel;

  @Field(type => BookSalesModel)
  bookSales: BookSalesModel;

}

流程的一个例子是:

  1. UI 使用发布者 ID“pub1”访问 Nest 服务
  2. Nest 服务转到出版商服务,它返回链接到出版商['book1', 'book2'] 的书籍列表
  3. Nest 服务然后点击返回 [{id: 'book1' title: ...}, {id: 'book2' title: ...}] 的 book-info-service
  4. Nest 服务然后点击返回 [{price: 123 currency: ...}, {price: 456 currency: ...}] 的 book-sa​​les-service
  5. 将两个数据集映射到 BookModel 列表
[{
  bookInfo: {id: 'book1' title: ...}
  bookSales: {price: 123 currency: ...}
}, {
  bookInfo: {id: 'book2' title: ...}
  bookSales: {price: 456 currency: ...}
}]

这是我遇到问题的解析器的简化版本:

@Query(returns => [BookModel])
async getBooksByPublisherId(
  @Args('id', { type: () => String }) id: string
) {
  this.publisherService.getBookIds(id)
    .then(response => {
      return response.data;
    })
}

@ResolveField('bookInfo', returns => BookInformationModel)
async getBookInfo() {
  return this.bookInfoService.getBookInfo(bookIds)
}

@ResolveField('bookSales', returns => BookSalesModel)
async getBookSalesInfo() {
  return this.bookSalesService.getSalesInfo(bookIds)
}

我遇到了两个问题:

  1. 如何与字段解析器共享图书 ID 列表?
  2. 我不确定如何为 bookInfobookSales 编写字段解析器,因为服务会返回一个对象列表。

【问题讨论】:

    标签: graphql nestjs


    【解决方案1】:

    想通了。我需要在 BookModel 上有 bookId。这样字段解析器就可以通过@Parent 访问它。

    export class BookModel {
    
      @Field()
      bookId: string;
    
      @Field(type => BookInformationModel)
      bookInfo: BookInformationModel;
    
    }
    
    @Query(returns => [BookModel])
    async getBooksByPublisherId(
      @Args('id', { type: () => String }) id: string
    ) {
      this.publisherService.getBookIds(id)
        .then(response => {
          return response.data.map(bookID => ({ bookId }));
        })
    }
    
    @ResolveField('bookInfo', returns => BookInformationModel)
    async getBookInfo(
      @Parent() bookModel: BookModel
    ) {
      return this.bookInfoService.getBookInfo(bookModel.bookId)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-10
      • 2018-08-05
      • 2019-12-21
      • 2017-01-07
      • 2018-09-02
      • 1970-01-01
      • 2017-07-29
      • 2023-02-03
      相关资源
      最近更新 更多