簡體   English   中英

在 graphql 模式中定義一個簡單的聯合返回類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM