【发布时间】: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;
}
流程的一个例子是:
- UI 使用发布者 ID“pub1”访问 Nest 服务
- Nest 服务转到出版商服务,它返回链接到出版商
['book1', 'book2']的书籍列表 - Nest 服务然后点击返回
[{id: 'book1' title: ...}, {id: 'book2' title: ...}]的 book-info-service - Nest 服务然后点击返回
[{price: 123 currency: ...}, {price: 456 currency: ...}]的 book-sales-service - 将两个数据集映射到 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)
}
我遇到了两个问题:
- 如何与字段解析器共享图书 ID 列表?
- 我不确定如何为
bookInfo、bookSales编写字段解析器,因为服务会返回一个对象列表。
【问题讨论】: