首页 > 解决方案 > 使用 apollo 服务器运行此查询时出现 GraphQL 错误。任何人都知道它有什么问题吗?

问题描述

我正在尝试从 GitHub GraphQL 获取一些数据,但我得到了一个 GaphQLError。我在 github 的开发人员部分尝试了相同的查询,它可以工作。有谁知道它有什么问题?

issueQuery = gql`
        query search(first: 10, type: ISSUE, query: "repo:angular/angular is:issue state:open") {
          issueCount
          edges {
            node {
              ... on Issue {
                createdAt
                title
                body
                url
                comments(first: 10) {
                  nodes {
                    body
                  }
                }
              }
            }
          }
        }
      `;

错误堆栈跟踪:

"GraphQLError: Syntax Error: Expected $, found Name "first"
    at syntaxError (http://localhost:4200/vendor.js:70270:10)
    at expect (http://localhost:4200/vendor.js:75154:67)
    at parseVariable (http://localhost:4200/vendor.js:73984:3)
    at parseVariableDefinition (http://localhost:4200/vendor.js:73970:15)
    at many (http://localhost:4200/vendor.js:75222:16)
    at parseVariableDefinitions (http://localhost:4200/vendor.js:73959:82)
    at parseOperationDefinition (http://localhost:4200/vendor.js:73926:26)
    at parseExecutableDefinition (http://localhost:4200/vendor.js:73881:16)
    at parseDefinition (http://localhost:4200/vendor.js:73845:16)
    at many (http://localhost:4200/vendor.js:75222:16)"

在参数前添加 $ 时的新错误堆栈跟踪:

"GraphQLError: Syntax Error: Expected Name, found Int "10"
    at syntaxError (http://localhost:4200/vendor.js:70270:10)
    at expect (http://localhost:4200/vendor.js:75154:67)
    at parseName (http://localhost:4200/vendor.js:73809:15)
    at parseNamedType (http://localhost:4200/vendor.js:74385:11)
    at parseTypeReference (http://localhost:4200/vendor.js:74364:12)
    at parseVariableDefinition (http://localhost:4200/vendor.js:73971:83)
    at many (http://localhost:4200/vendor.js:75222:16)
    at parseVariableDefinitions (http://localhost:4200/vendor.js:73959:82)
    at parseOperationDefinition (http://localhost:4200/vendor.js:73926:26)
    at parseExecutableDefinition (http://localhost:4200/vendor.js:73881:16)"

标签: graphqlangular7

解决方案


不要将操作与正在查询的实际字段混淆。语法应如下所示:

operationType [operationName] [variableDefinitions] {
  selectionSet
}

其中operationType一个或是调试query中使用的操作的任意名称,是您在操作中引用的任何变量的类型定义,并且是您实际查询的一个或多个字段。mutationsubscriptionoperationNamevariableDefinitionsselectionSet

在这种情况下,search是我们要查询的字段,因此不应以query关键字开头。如果您经过身份验证,这可以正常工作:

query OptionalName {
  search(first: 10, type: ISSUE, query: "repo:angular/angular is:issue state:open") {
    issueCount
    edges {
      # more fields
    }
  }
}

如果操作类型是query,则可以完全省略query关键字。这称为“查询速记”:

{
  search(first: 10, type: ISSUE, query: "repo:angular/angular is:issue state:open") {
    issueCount
    edges {
      # more fields
    }
  }
}

如果您使用变量,请在操作旁边的括号内定义它们。变量名称是任意的,但按照惯例,我们使用它们将用于的输入字段名称:

query OptionalName ($first: Int, type: SearchType!, $query: String! ) {
  search(first: $first, type: $type, query: $query) {
    issueCount
    edges {
      # more fields
    }
  }
}

推荐阅读