NestJS | GraphQL-如何从多个数据集中解析嵌套对象的列表

问题描述

我正在使用GraphQL设置nestJS服务,使其成为UI和多个其他服务之间的中间人。为了这个示例,我需要显示一本书的列表,其中包含来自单个出版商的相关信息。

用户界面将以发布者ID进入nest服务。然后,我需要致电服务并获取图书ID的列表。当我拥有ID列表时,我需要点击两个单独的服务,每个服务针对每个书ID返回一个对象列表。然后,我需要从两个数据集中建立一个书籍对象列表。

书籍模型的一个示例是:

export class BookModel {

  @Field(type => Book@R_854_4045@ionModel)
  bookInfo: Book@R_854_4045@ionModel;

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

}

流程示例:

  1. UI的发布者ID为“ pub1”,打入nest服务
  2. 嵌套服务转到发布者服务,该服务返回链接到发布者['book1','book2']的书籍列表
  3. 嵌套服务然后点击返回[{id: 'book1' title: ...},{id: 'book2' title: ...}]的book-info-service
  4. 嵌套服务然后点击返回[{price: 123 currency: ...},{price: 456 currency: ...}]的图书销售服务
  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 => Book@R_854_4045@ionModel)
async getBookInfo() {
  return this.bookInfoService.getBookInfo(bookIds)
}

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

我遇到两个问题:

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

解决方法

弄清楚了。我需要在BookModel上有bookId。这样,字段解析器可以通过<!DOCTYPE etl SYSTEM "http://scriptella.org/dtd/etl.dtd"> <etl> <description>Scriptella ETL File Template.</description> <properties> <include href="etl.properties"/> <!--Load from external properties file--> </properties> <!-- Connection declarations --> <connection driver="$driver" url="$url" user="$user" password="$password" classpath="$classpath"/> <!--ETL Queries and Scripts --> <query> select * from TestDB.dbo.GLAccounts; <script> insert into TestDB.dbo.test (id) values (?1); </script> </query> </etl> 访问它。

@Parent
export class BookModel {

  @Field()
  bookId: string;

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

}