【问题标题】:Features work, but console delivers extraneous error: "Variable "$id" of required type "ID!" was not provided."功能有效,但控制台提供无关错误:“未提供所需类型“ID!”的变量“$id”。”
【发布时间】:2022-04-18 15:14:18
【问题描述】:

我的 CRUD 操作有效。但是它们中的许多也产生了一个我无法追踪的单一的、特定的控制台错误。

[GraphQL error]: Message: Variable "$id" of required type "ID!" was not provided., Location: [object Object], Path: undefined

示例:我可以查看用户列表而不会产生错误,并且我可以访问单个用户的“详细信息”视图而不会产生错误。这两个工作正常隔离。但不知何故,从前者遍历到后者会产生错误。

我在 GraphQL-Playground 中测试了两个查询(用户和用户),没有收到错误。我还尝试将 ID 作为“String”类型而不是“ID!”类型。 (也没有!)。我尝试了其他将用户 ID 提供给解析器的“hacky”方式。我已经尝试传递其他字段来代替查询解析器中的“信息”参数。

重申一下,单独查看任一页面(即:清除控制台并重新加载任一页面)不会触发错误。这似乎是关于从/usersuser?id=12345 的旅程。

来自 datamodel.prisma:

type User {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
name: String!
email: String! @unique
password: String!
resetToken: String
resetTokenExpiry: Float
permissions: Permission
posts: [Post]! @relation(name: "PostsOfUser" onDelete: CASCADE)
comments: [Comment!]! @relation(name: "CommentsOfUser" onDelete: 
CASCADE)

来自 schema.graphql 中的查询对象: user(id: ID!): User

用户查询解析器:

async user(parent, { id }, { db, request }, info) {
    const user = await db.query.user({ where: { id } }, info);
    return user;

使用 react-apollo 和 graphql-tag 包的 gql 查询:

const SINGLE_USER_QUERY = gql`
query SINGLE_USER_QUERY($id: ID!){
    user(id: $id) {
        id
        name
        email
        permissions
        createdAt
        updatedAt

    }
}
`;

预期行为: 用户可以从用户列表中单击单个用户,随后的页面将包含有关该用户的详细信息。

实际结果:有效,但也会产生控制台错误:

[GraphQL error]: Message: Variable "$id" of required type "ID!" was 
not provided., Location: [object Object], Path: undefined
index.js:86 

[Network error]: ServerError: Response not successful: Received status code 400
index.js:2178 GraphQL error occurred [getDataFromTree] Error: 
Network error: Response not successful: Received status code 400
at new ApolloError (ApolloError.js:37)
at QueryManager.js:328
at QueryManager.js:700
at Array.forEach (<anonymous>)
at QueryManager.js:699
at Map.forEach (<anonymous>)
at QueryManager.push../node_modules/apollo-client/core/QueryManager.js.QueryManager.broadcastQueries (QueryManager.js:694)
at QueryManager.js:277

【问题讨论】:

  • 触发路由变化的代码是什么?来自/users to user?id=12345.
  • 能否在前端显示调用 SINGLE_USER_QUERY 的代码??
  • 看起来您正在使用 SSR,这就是问题所在。如果我不得不猜测,您的请求在服务器端失败,但前端正在弥补不足,因此您的页面仍然可以正常呈现。如果不查看 a) 相关查询及其请求方式、b) 您的客户端配置和 c) 相关 SSR 代码,这可能很难诊断。
  • @GuilhermeSoldateli code snippet
  • @JVLobo code snippet

标签: graphql react-apollo next.js prisma-graphql


【解决方案1】:

请为参数添加一个if条件,并检查是否为真。然后在其中添加一个 get(REST API) 或 query(GrahQL) 函数。然后它不会显示此错误。请看下面的例子

async user(parent, { id }, { db, request }, info) {
    if ( id ) {
       //enter your code
       const user = await db.query.user({ where: { id } }, info);
       return user;
    }
}

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 2020-04-06
    • 2019-05-29
    • 2019-03-22
    • 2021-07-18
    • 2020-08-24
    • 2012-03-17
    • 1970-01-01
    • 2019-11-13
    相关资源
    最近更新 更多