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:模式必须定义查询操作的主要内容,如果未能解决你的问题,请参考以下文章
NestJS 5 GraphQL 错误查询在解析器中定义,但不在模式中