GraphQL:模式必须定义查询操作

Posted

技术标签:

【中文标题】GraphQL:模式必须定义查询操作【英文标题】:GraphQL: A schema must have a query operation defined 【发布时间】:2020-05-09 03:46:52 【问题描述】:

我的 IDE(带有 JS GraphQL 的 phpstorm)给了我架构的标题错误。

我是 GraphQL 新手,如果实际查询操作仅在根级别有突变,应该将查询设置为什么?

以下是从 (Shopify) 教程中提取的实际查询,用于他们的 GraphQL API。我正在复制我的本地架构定义,它试图适应它的形状。

如您所见,查询完全嵌套在一个突变中,所以我什至不知道根级别的查询定义应该有什么。

// graphql.ts

import "isomorphic-fetch";

const buildPricingPlanQuery = (redirectUrl: string) => `mutation 
  appSubscribeCreate(
    name : "Plan 1"
    returnUrl : "$redirectUrl"
    test : true
    lineItems : [
      
        plan : 
          appUsagePricingDetails : 
            cappedAmount : 
              amount : 10
              , currencyCode : USD
            
            terms : "Up to 50 products"
          
        
      
      
        plan : 
          appRecurringPricingDetails : 
            price : 
              amount : 10
              , currencyCode : USD
            
            terms : "some recurring terms"
          
        
      
    ]
  )
  
    userErrors 
      field
      message
    
    confirmationUrl
    appSubscription 
      id
    
  
`;


export const requestSubscriptionUrl = async (ctx: any, accessToken: string, shopDomain: string) =>  
  const requestUrl = `https://$shopDomain/admin/api/2019-10/graphql.json`;

  const response = await fetch(requestUrl, 
    method : 'post'
    , headers : 
      'content-type' : "application/json"
      , 'x-shopify-access-token' : accessToken
    ,
    body : JSON.stringify(query: buildPricingPlanQuery(`https://$shopDomain`))
  );

  const responseBody = await response.json();
  const confirmationUrl = responseBody
    .data
    .appSubscriptionCreate
    .confirmationUrl;

  return confirmationUrl;
;
// pricingSchema.graphql

# ------------ Minor Types

enum CurrencyCode 
  USD
  EUR
  JPY


type cappedAmount 
  amount: Int
  currencyCode : CurrencyCode


type appUsagePricingDetails 
  cappedAmount: cappedAmount


input PlanInput 
  appUsagePricingDetails: cappedAmount
  terms: String


type userErrors 
  field: String
  message: String


type appSubscription 
  id: Int


# ------------ Major Type and Schema definition

type PricingPlan 
  appSubscribeCreate(
    name: String!
    returnUrl: String!
    test: Boolean
    lineItems: [PlanInput!]!
  ): String
  userErrors: userErrors
  confirmationUrl: String
  appSubscription: appSubscription


schema 
  mutation: PricingPlan

【问题讨论】:

【参考方案1】:

你看到的错误是指GraphQL specification的这个规定:

必须提供查询根操作类型,并且必须是 Object 类型。

已经有一个 couple proposals 来删除这个限制,但在最新的(2018 年 6 月)规范中,如果没有 Query 类型,则认为架构无效。该规范还规定对象类型(包括查询)不能为空。

我的建议:只需添加一个简单的查询类型,例如

type Query 
    ping: String @deprecated(reason: "https://***.com/questions/59868942/graphql-a-schema-must-have-a-query-operation-defined")

如果规范得到更新,您可以稍后将其删除:)

【讨论】:

以上是关于GraphQL:模式必须定义查询操作的主要内容,如果未能解决你的问题,请参考以下文章

graphql 查询或突变能否返回标量值

GraphQL 突变和查询:无法读取未定义的属性

Apollo GraphQL 错误:必须提供查询根类型

NestJS 5 GraphQL 错误查询在解析器中定义,但不在模式中

Strapi - 如何使用自定义属性扩展 graphql 类型模式?

你可以在graphql服务器模式文件中使用片段吗