我有一个 GraphQL 服务器,它能够为指定的源(例如,传感器数据)提供时间序列数据。获取传感器数据的示例查询可能是:
query fetchData {
timeseriesData(sourceId: "source1") {
data {
time
value
}
}
}
在我的前端,我希望允许用户选择 1 个或多个来源并显示一个图表,其中每个来源都有一条线。使用这样的查询似乎可以做到这一点:
query fetchData {
series1: timeseriesData(sourceId: "source1") {
data {
time
value
}
}
series2: timeseriesData(sourceId: "source2") {
data {
time
value
}
}
}
大多数 GraphQL 教程似乎都关注静态查询(例如,唯一改变的是变量,而不是请求的实际形状) - 但在我的情况下,我需要查询本身是动态的(每个都有一个 timeseriesData 请求我选择的 ID)。
我有以下限制:
- 修改服务器的架构不是一种选择(例如,我不能将一组 ID 传递给解析器)
- 我的查询是使用模板字符串指定的,例如 gql`...`
- 我不想手动将查询构建为字符串,因为这似乎是灾难的根源,并且意味着我失去了所有工具优势(例如自动完成、语法突出显示、linting)
我正在使用的堆栈是:
- Apollo 客户端(特别是 apollo-angular)
- 角
- 打字稿
- graphql-tag(用于定义查询)
理想情况下,我想要做的是有某种方式将两个查询合并为一个,这样我就可以按照第一个示例定义它们,然后在抽象层中将它们连接在一起,这样我就可以像第二个示例一样获得单个查询通过电线发送。
但是我不确定如何实现这一点,因为 graphql-tag 正在将查询解析为 AST,我正在努力理解以这种方式操作查询是否可行。
有什么技术可以生成这样的动态查询,而查询的形状是未知的?