[英]Defining a simple union return type in a graphql schema
我實際上不確定為什么,但我似乎無法解決這個看似簡單的問題。 我有一個 graphql 架構如下:
import { gql } from 'apollo-server-core';
export const querySchema = gql`
type AffiliateBalance {
pendingBalance: Float!
qualifiedBalance: Float!
}
type Query {
me: User!
users(input: PaginationInput): [User!]!
user(id: Int!): User!
referrals(input: GetReferralsInput): GetReferralsResponse!
affiliateTransactions(
limit: Int
skip: Int
type: TransactionType
): GetAffiliateTransactionsResponse!
affiliatePerformanceMetrics: AffiliatePerformanceMetricsResponse!
affiliateSessions(limit: Int, skip: Int): GetAffiliateSessionsResponse!
affiliateSessionMetrics: AffiliateSessionMetricsResponse!
affiliateBalancePending: Float!
affiliateBalanceQualified: Float!
affiliateBalance: Float! | AffiliateBalance!
}
`;
我最近添加了一個affiliateBalance
查詢,它可以返回一個數字給 2DP(例如 47.28),或者這個 object:
`{ pendingBalance: some2DPNumber, qualifiedBalance: some2DPNumber }`
但我收到此錯誤:
return new _GraphQLError.GraphQLError(`Syntax Error: ${description}`, {
^
GraphQLError: Syntax Error: Expected Name, found "|"
我在這里做錯了什么? 如果它被認為是“|”的語法錯誤符號,它實際上如何固定? affiliateBalance
查詢的結果需要是聯合,因此是符號。
我正在將 Apollo Server 與節點一起使用。 謝謝
更新:
我按照要求使用問題中的代碼得到的錯誤: /Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/error/syntaxError.js:15 return new _GraphQLError.GraphQLError(
Syntax Error: ${description} , { ^ GraphQLError: Syntax Error: Expected Name, found "|". at syntaxError (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/error/syntaxError.js:15:10) at Parser.expectToken (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:1413:40) at Parser.parseName (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:107:24) at Parser.parseFieldDefinition (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:845:23) at Parser.optionalMany (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:1510:28) at Parser.parseFieldsDefinition (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:831:17) at Parser.parseObjectTypeDefinition (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:803:25) at Parser.parseDefinition (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:171:23) at Parser.many (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:1529:26) at Parser.parseDocument (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:121:25) { path: undefined, locations: [ { line: 22, column: 30 } ], extensions: [Object: null prototype] {} }
, { ^ GraphQLError: Syntax Error: Expected Name, found "|". at syntaxError (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/error/syntaxError.js:15:10) at Parser.expectToken (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:1413:40) at Parser.parseName (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:107:24) at Parser.parseFieldDefinition (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:845:23) at Parser.optionalMany (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:1510:28) at Parser.parseFieldsDefinition (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:831:17) at Parser.parseObjectTypeDefinition (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:803:25) at Parser.parseDefinition (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:171:23) at Parser.many (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:1529:26) at Parser.parseDocument (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/language/parser.js:121:25) { path: undefined, locations: [ { line: 22, column: 30 } ], extensions: [Object: null prototype] {} }
然后,如果我將其更改為:
import { gql } from 'apollo-server-core';
export const querySchema = gql`
type AffiliateBalance {
pendingBalance: Float!
qualifiedBalance: Float!
}
union RawAffiliateBalance = Float | AffiliateBalance
type Query {
me: User!
users(input: PaginationInput): [User!]!
user(id: Int!): User!
referrals(input: GetReferralsInput): GetReferralsResponse!
affiliateTransactions(
limit: Int
skip: Int
type: TransactionType
): GetAffiliateTransactionsResponse!
affiliatePerformanceMetrics: AffiliatePerformanceMetricsResponse!
affiliateSessions(limit: Int, skip: Int): GetAffiliateSessionsResponse!
affiliateSessionMetrics: AffiliateSessionMetricsResponse!
affiliateBalancePending: Float!
affiliateBalanceQualified: Float!
affiliateBalance: RawAffiliateBalance!
}
`;
我收到此錯誤:
/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/type/validate.js:59
throw new Error(errors.map((error) => error.message).join('\n\n'));
^
Error: Union type RawAffiliateBalance can only include Object types, it cannot include Float.
at assertValidSchema (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/type/validate.js:59:11)
at assertValidExecutionArguments (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/execution/execute.js:194:35)
at execute (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/graphql/execution/execute.js:113:3)
at generateSchemaHash (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/apollo-server-core/src/utils/schemaHash.ts:25:25)
at ApolloServer.generateSchemaDerivedData (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/apollo-server-core/src/ApolloServer.ts:716:42)
at Object.schemaDerivedDataProvider (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/apollo-server-core/src/ApolloServer.ts:333:18)
at new SchemaManager (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/apollo-server-core/src/utils/schemaManager.ts:76:36)
at new ApolloServerBase (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/apollo-server-core/src/ApolloServer.ts:328:24)
at new ApolloServer (/Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/node_modules/apollo-server-express/src/ApolloServer.ts:55:1)
at /Users/nick/Documents/Coding/Projects/Practice/PERNTG/server/src/index.ts:20:48
我相信您應該能夠定義一個聯合類型(向下滾動找到該部分,他們在文檔中沒有使用 ids 來輕松散列)
大約是這樣的:
type AffiliateBalance {
pendingBalance: Float!
qualifiedBalance: Float!
}
union RawAffiliateBalance = Float | AffiliateBalance
type Query {
//...
affiliateBalance: RawAffiliateBalance!
由於 Apollo gql 嚴格解釋 graphql 規范(參見https://github.com/graphql/graphql-spec/issues/215 ),並且這至少 7 年來一直是一個未解決但爭論不休的問題,我建議你可以嘗試裝箱您的標量以解決 graphql 中的問題。
type AffiliateBalance {
pendingBalance: Float!
qualifiedBalance: Float!
}
type RawBalance {
value: Float!
}
union RawAffiliateBalance = RawBalance | AffiliateBalance
type Query {
//...
affiliateBalance: RawAffiliateBalance!
這需要修改您希望提供給客戶端的響應負載,這可能比預期的工作量更多。 另一種可能性(旨在避免更改客戶端)是像這樣包裝它並公開一個不是 graphql 的適配器端點,並且只是為您轉換最終值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.