javascript - 缺少对象 GraphQL+Apollo 错误的选择集
问题描述
我有一组触发某些类型弹出窗口的本地状态的突变。它们通常是这样设置的:
openDialog: (_, variables, { cache }) => {
const data = {
popups: {
...popups,
dialog: {
id: 'dialog',
__typename: 'Dialog',
type: variables.type
}
}
};
cache.writeData({
data: data
});
return null;
}
我传入的默认值如下所示:
const defaults = {
popups: {
__typename: TYPENAMES.POPUPS,
id,
message: null,
modal: null,
menu: null,
dialog: null
}
};
在我的 React 代码中使用它们的方式是使用 Mutation 包装器组件,如下所示:
const OPEN_ALERT_FORM = gql`
mutation AlertOpenDialog($type: String!) {
openDialog(type: $type) @client
}
`;
class Alert extends Component {
render() {
return (
<Mutation mutation={OPEN_ALERT_FORM} variables={{ type: ALERT_FORM }}>
{openDialog => {
return (
<Button
classes="alert-button"
onClick={openDialog}
label="Trigger Alert"
/>
);
}}
</Mutation>
);
}
}
对于我的各种弹出窗口(我有 3 或 4 个不同的弹出窗口,比如menu
and modal
),打开和关闭它们的突变看起来都一样,只是类型名和内容不同等。但是,对于对话框,当我点击它们时会出现此错误:
网络错误:为查询字段对话框返回的对话框类型对象缺少选择集
...然后触发组件从页面中消失。另外,一旦发生这种情况,当您尝试单击它们时,所有其他弹出类型都会消失,然后重新抛出该错误,或者说:
未捕获的错误:引发了跨域错误。React 无法访问开发中的实际错误对象。
我已经尝试重新编写对话框以匹配其他弹出类型,并重新编写组件,但我仍然收到此错误。它似乎是特定于对话+阿波罗的。这个问题的根源可能是什么?这不可能是后端的事情,因为这只是与本地 Apollo 打交道。我以前没有见过这个错误,我不知道从这里去哪里。
解决方案
解决方案是向查询中添加字段(而不是声明要获取的顶级对象而不指定要获取的字段)。如果你有类似的东西:
{
popups @client {
id
dialog
}
}
您必须声明一些要在其中获取的字段dialog
,例如id
:
{
popups @client {
id
dialog {
id
}
}
}
推荐阅读
- node.js - 变量 x 保存以下字符串数据。我如何解析它以用作对象
- groovy - 如何解释这个 Groovy 表达式?
- python - 如何让python通过cmake在自定义位置查找numpy(用于构建C++共享对象库)
- single-sign-on - 在 openiddict 中使用 iframe 单点注销,如何知道已登录的客户端应用程序?
- c++ - 如何使用 Eigen 库计算 uint8_t 数组的点积?
- python-3.x - 康达包安装
- javascript - 在 react-native 中,index.js 的捆绑永远存在
- spring-boot - Spring Cloud Function(GCP 适配器)抛出 Hibernate lazy 无法初始化代理 - 没有会话
- pandas - Pandas 在整个 DataFrame 中对函数对象的应用进行矢量化
- c# - 设置数组项变量的值