angular - 向 apollo watchQuery 添加标头会给出未定义的数据
问题描述
我正在使用apollo-angular包来使用 graphQL 查询后端。一切正常,直到我将标题添加到查询中。
我正在添加自定义标头以从后端获取扁平数据。
当我向查询添加标题时,我得到的数据未定义。虽然我可以在网络选项卡中看到正确的响应(扁平数据)。
这是我的代码:
constructor(private apollo: Apollo) { }
getPos(id: string, date: string) : Observable<any> {
return this.apollo
.watchQuery({
query: gql`
{
pos(id: 10001, date: "2017-02-01") {
id
quantity
price
security {
id
....
}
....
}
}`,
context: {
headers: new HttpHeaders().set("isFlatten", "true") // adding header
}
})
.valueChanges
.pipe(
tap(resp => console.log(resp.data)),
map(result => result.data['pos'])
);
}
响应数据(展平)
{
"data": [
{
"data.pos.security.__typename": "Security",
"data.pos.quantity": 14,
"data.pos.id": 3,
"data.pos.price": 740.6634841227037,
"data.pos.security.id": 296
.............
},
{
"data.pos.security.__typename": "Security",
"data.pos.quantity": 34,
"data.pos.id": 13,
"data.pos.price": 755,
"data.pos.security.id": 290
...........
}]
}
注意:另外,如果我删除 context 属性,它会正确打印响应(非展平数据)
解决方案
根据规范:
响应中的数据条目将是请求操作的执行结果。如果操作是查询,则此输出将是模式查询根类型的对象;如果操作是突变,则此输出将是模式的突变根类型的对象。
数据应该是一个对象,其键与文档中请求的根字段匹配(pos
在本例中)。Apollo 期望值为data.pos
,但由于data
是一个数组并且没有此属性,因此它返回未定义。
像这样格式化你的 GraphQL 响应服务器端会破坏规范并使你的 API 与 apollo-client 不兼容。即使data
是具有pos
属性的对象,以这种方式格式化您的响应也可能会破坏缓存。
推荐阅读
- android - 发布前报告在像素 2 中出现错误
- bash - 重命名目录和(深度嵌套的)子目录中的所有文件
- mysql - mysql查询与日期之间的时间间隔
- security - 可以提交跨站点脚本 (XSS) 模式
- java - 在 Dataflow 中处理一对多阶段的正确方法
- java - 关于 spring-boot-admin ,客户端配置
- python - Python 3.6:使用 DictWriter 重命名列标题
- javascript - Vue.js 列表过滤 - 没有结果回退
- javascript - 如何清除无效数据的 JavaScript 字符串?
- ios - Swift:表格视图部分标题