refetchQueries options.include 数组中请求了名为“fetchEstimateTemplate”的未知查询

问题描述 投票:0回答:2

我有以下定义的函数:

const handleSave = useCallback(
   async ({
         id,
         ...values
      }: EstimateTemplateFormState) => {

         if (id && props.estimateTemplateId) {

            # # # # # # # # # Updating # # # # # # # # # # #

            const params = {
               estimateTemplateId: id,
               ...values
            };

            const {
               data
            } = await updateEstimateTemplate({
               variables: {
                  params
               },
               refetchQueries: ['fetchEstimateTemplate']
            });

         } else {

            # # # # # # # # # Creating # # # # # # # # # # #

            const params = values;

            const {
               data
            } = await createEstimateTemplate({
               variables: {
                  params
               },
               refetchQueries: ['fetchEstimateTemplate']
            });

         }
      },
      [createEstimateTemplate, updateEstimateTemplate, props.estimateTemplateId]
);

此函数与 formik 一起使用,为称为估计模板的实体实现自动保存功能。当我编辑一个这样的实体时,代码的更新部分从头到尾都按预期完美运行。然而,当我开始创建一个实体时,我遇到了这个问题:

Unknown query named "fetchEstimateTemplate" requested in refetchQueries options.include array

我不太明白为什么会这样。如果我不得不猜测,那一定是因为编辑估算模板实体存在,而在创建过程中则不存在。有什么办法可以解决这个问题吗?我对 React/graphql/apollo 不太熟悉,但我假设我缺少一些简单的东西来获取新创建的估计模板实体。

编辑

我的 graphql 函数定义如下:

query fetchEstimateTemplate($id: ID!) {
  estimateTemplate(id: $id) {
      .........fields........
  }
}
reactjs graphql
2个回答
0
投票

来自文档

refetchQueries 数组中的每个元素都是以下之一:

  • 使用 gql 函数解析的 DocumentNode 对象
  • 您之前执行的查询的名称,作为字符串(例如 GetComments)
    • 要按名称引用查询,请确保每个应用程序的查询都有唯一的名称。

对于 GraphQL 查询

fetchEstimateTemplate
,当您第一次调用该查询时,该查询是如何命名的?查询的名称和实际执行的操作的名称之间存在差异。 Apollo 需要查询的名称,因为它是在
.graphql
文件中定义的或由
gql-tag
标记的。

例如,如果您的查询如下所示:

query GetEstimateTemplate($id: String!) {
  fetchEstimateTemplate(id: $id) {
    __typename
    id
  }
}

您会将

GetEstimateTemplate
传递到
refetchQueries
,而不是
fetchEstimateTemplate
。我不确定操作的 nae 与查询的名称是否使用了正确的术语,但这里最重要的是传入
query OPERATION_NAME_HERE
OPERATION_NAME_HERE
部分,而不是实际的查询它会在你的后端被调用。


0
投票

我多次遇到这个问题。使用

refetchQueries
时应考虑两个概念:

  • refetchQueries
    数组中的查询必须是您命名的查询。在您的示例中将是
    fetchEstimateTemplate
    (您应该首先使用大写字母命名查询)
  • Apollo 从其缓存中存储的查询中调用重新获取。这意味着 Apollo 将从缓存中获取查询及其变量,因此 必须在重新获取查询之前在某个时刻调用该查询

如果您对之前未调用过的查询调用重新获取,Apollo 将失败,因为它不知道那是什么。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.