繁体   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