useQuery 错误对象为 graphQLErrors 属性返回空数组

Posted

技术标签:

【中文标题】useQuery 错误对象为 graphQLErrors 属性返回空数组【英文标题】:useQuery error object returns empty array for graphQLErrors property 【发布时间】:2020-08-20 22:46:22 【问题描述】:

我有一个 MERN 应用程序,它使用反应钩子和 @apollo/react-hooks 来执行突变和查询。该应用程序按预期工作,但现在我正在尝试处理我的应用程序的错误处理代码。我有这个问题

export const getStacks = gql`
query 
    stacks
        title,
        notecards 
            question,
            answer
        ,
        id
    

`;

我故意把它改成这个

export const getStacks = gql`
query 
    storks
        tile,
        notecards 
            question,
            answer
        ,
        id
    

`;

当我这样做并尝试从

访问stacksError

const loading: isGetStacksLoading, error: stacksError, data: stacksData = useQuery(getStacks);

我在stacksError 中收到服务器错误,并且没有graphQLErrors

当我控制台日志stacksError我在控制台看到这个时的意思

Error: Network error: Response not successful: Received status code 400

在我的 App.js 文件中,我使用 createHttpLinkApolloClientApolloProvider

有谁知道为什么stacksError 会返回服务器错误并且没有graphQLErrors 属性会告诉我我的查询不正确?

附言

我已将 apollo-link-error 添加到我的 App.js 中,当它被调用时,我能够解构错误对象并记录 graphQLErrors 道具以及 networkError 道具和控制台中的内容分别见:

[GraphQL error]: Message: Cannot query field "storks" on type "RootQueryType". Did you mean "stacks" or "stack"?, Location: [object Object], Path: undefined

[Network Error]: ServerError: Response not successful: Received status code 400

这让我更加困惑,因为它表明存在作为 grapQLErrors 属性,但在我的组件中无法访问内容

哦!我也在为我的应用程序使用 react-router,也许我必须像使用 redux 一样传递一些东西或像“连接”我的组件?身份证

【问题讨论】:

【参考方案1】:

graphQLErrors 仅在服务器返回 200 状态代码但响应包含 errors 数组时才会填充 - 然后这些 errors 在挂钩返回的 error 对象中显示为 graphQLErrors (和其他地方,例如 ErrorLink)。

如果在执行对服务器的请求时发生错误,则会将错误视为networkError。 GraphQL 服务器通常以 400 状态响应格式错误或无效的查询——这意味着这些错误将被视为 networkError 而不是 graphQLErrors

【讨论】:

这可以追踪,但是 apollo 文档中的这个示例为什么显示当查询格式错误时,errors 对象仍然具有 graphQLError 属性? apollographql.com/docs/react/data/error-handling 。我误解了这个例子吗? 对于其他调查此问题的人。上述答案在技术上是正确的。通过执行此 github 问题的评论 github.com/apollographql/apollo-link/issues/… 中提到的操作,我能够访问我的错误

以上是关于useQuery 错误对象为 graphQLErrors 属性返回空数组的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Apollo 客户端 useQuery 中的错误传播?

apollo usequery 导致未定义的错误

Apollo useQuery 钩子不会使用 writeQuery() 方法从缓存中获取更新。没有看到错误

我正在尝试在 Typescript 中使用 useQuery

将 useQuery 返回的数据设置为状态

如何使用 useQuery 钩子在其他钩子中填充状态?