缺少对象GraphQL + Apollo错误的选择集

Cas*_*ams 8 javascript apollo reactjs graphql react-apollo

我有一组突变触发某些类型的弹出窗口的本地状态.它们通常设置如下:

  openDialog: (_, variables, { cache }) => {
    const data = {
      popups: {
        ...popups,
        dialog: {
          id: 'dialog',
          __typename: 'Dialog',
          type: variables.type
        }
      }
    };

    cache.writeData({
      data: data
    });
    return null;
  }
Run Code Online (Sandbox Code Playgroud)

我传入的默认值如下:

const defaults = {
  popups: {
    __typename: TYPENAMES.POPUPS,
    id,
    message: null,
    modal: null,
    menu: null,
    dialog: null
  }
};
Run Code Online (Sandbox Code Playgroud)

它们在我的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>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

对于我的各种弹出窗口(我有3或4个不同的,像menumodal),打开和关闭它们的突变看起来都一样,只是不同的类型名和内容等.但是,对于Dialogs,当我点击它们时出现这个错误:

网络错误:为查询字段对话框返回的Dialog类型对象缺少选择集

...然后触发组件从页面中消失.另外,一旦发生这种情况,当您尝试单击它们时,所有其他弹出窗口类型都会消失,并重新抛出该错误,或​​者说:

未捕获错误:抛出了跨源错误.React无法访问开发中的实际错误对象.

我已经尝试重写对话框以匹配其他弹出窗口类型,并重新编写组件,但我仍然收到此错误.它看起来似乎是对话+阿波罗特定的.什么可能是这个问题的根源?它不能成为后端的东西,因为这只涉及当地的阿波罗.我以前没见过这个错误,我不知道从哪里开始.

Vic*_*Vic 9

有同样的问题错误消息.似乎这是到目前为止stackoverflow中唯一的问题,在问题中使用相同的错误消息.

我会记下我的一面

在我的例子中,我有一个查询不查询对象的字段.对这种情况很厌倦,我看起来像这样的查询

{
  popups @client {
    id
    dialog
  }
}
Run Code Online (Sandbox Code Playgroud)

它应该是

{
  popups @client {
    id
    dialog {
      id
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Cas*_*ams 0

事实证明,通过将该dialog字段视为字符串而不是对象,可以解决此问题。将函数更改为这个就可以了,并且错误消失了:

  openDialog: (_, variables, { cache }) => {
    const data = {
      popups: {
        ...popups,
        dialog: variables.type
      }
    };

    cache.writeData({
      data: data
    });
    return null;
  }
Run Code Online (Sandbox Code Playgroud)