问题描述
我正在使用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;
}
流程示例:
- UI的发布者ID为“ pub1”,打入nest服务
- 嵌套服务转到发布者服务,该服务返回链接到发布者
['book1','book2']
的书籍列表 - 嵌套服务然后点击返回
[{id: 'book1' title: ...},{id: 'book2' title: ...}]
的book-info-service - 嵌套服务然后点击返回
[{price: 123 currency: ...},{price: 456 currency: ...}]
的图书销售服务 - 将两个数据集映射到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)
}
我遇到两个问题:
- 如何与现场解析器共享图书ID列表?
- 由于服务返回对象列表,我不确定如何为
bookInfo
,bookSales
编写字段解析器。
解决方法
弄清楚了。我需要在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;
}