【问题标题】:<Mutation /> refetchQueries "Unknown directive "_"."<Mutation /> refetchQueries "未知指令 "_"。"
【发布时间】:2019-03-13 21:24:16
【问题描述】:

我正在使用react-apollo&lt;Mutation /&gt; 组件与refetchQueries

UPDATE_TASK

export const UPDATE_TASK = gql`
  mutation updateTask(
    $id: Int!
    $title: String!
    $priority: PriorityType!
    $assigneeId: String!
    $dueDate: Datetime!
    $details: String!
    $changedAt: Datetime!
  ) {
    updateIssueTaskById(
      input: {
        id: $id
        issueTaskPatch: {
          title: $title
          priority: $priority
          assigneeId: $assigneeId
          dueDate: $dueDate
          details: $details
          changedAt: $changedAt
        }
      }
    ) {
      issueTask {
        id
      }
    }
  }
`;

const onUpdateTask = ({ render }) => <Mutation mutation={UPDATE_TASK} refetchQueries={[{query: GET_TASKS_BY_USER_ID}]} awaitRefetchQueries={true}>
    {(mutation, result, ...rest) => render({ mutation, result, rest })}
  </Mutation>

这按预期工作,初始突变发布,我们得到另一个查询,完全符合我们的预期:

导致问题的是Query

请求负载

[{
    "operationName": "getTasksByUserId",
    "variables": {},
    "query": "query getTasksByUserId($assigneeId: String!) {\n  tasks: allIssueTasks(condition: {assigneeId: $assigneeId, status: OPEN}) @_(get: \"edges\") {\n    edges @_(map: \"node\") {\n      node {\n        id\n        title\n        createdAt\n        priority\n        dueDate\n        details\n        status\n        assigneeId\n        creatorId\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n}\n"
}]

响应

[{
    "errors": [{
        "message": "Unknown directive \"_\".",
        "locations": [{
            "line": 2,
            "column": 76
        }]
    }, {
        "message": "Unknown directive \"_\".",
        "locations": [{
            "line": 3,
            "column": 11
        }]
    }]
}]

【问题讨论】:

    标签: javascript reactjs graphql react-apollo


    【解决方案1】:

    @_ 指令不是内置指令,而是由graphql-lodash 添加的,这是一个实验性客户端库,旨在任意转换 GraphQL 响应。该指令仅由库本身使用。在后台,graphql-lodash 实际上在将请求发送到服务器之前删除了该指令。如果它不这样做,服务器将收到一个它无法识别的指令并抛出一个验证错误,就像你看到的那样。

    由于您看到该验证错误,这意味着您根本没有使用 graphql-lodash,或者没有正确配置它。 here 提供了使用 react-apollo 的库的说明。最简单的方法是使用自定义链接:

    new ApolloLink((operation, forward) => {
      const { query, transform } = graphqlLodash(operation.query);
      operation.query = query;
      return forward(operation)
        .map(response => ({
          ...response,
          data: transform(response.data),
        }));
    });
    

    如果您要使用refetchrefetchQueries 触发查询,则应使用上述链接。使用包装器 HOC 将不起作用,因为查询将直接发送到服务器,而无需首先由库进行转换。

    【讨论】:

    • 出色的工作 Daniel :) 谢谢你,我现在需要弄清楚如何从突变中取回数据……因为据我所知,它没有传回。
    猜你喜欢
    • 2021-10-04
    • 2018-07-15
    • 1970-01-01
    • 2019-01-12
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2017-07-28
    相关资源
    最近更新 更多