【问题标题】:How to use unions with GraphQL buildSchema如何在 GraphQL buildSchema 中使用联合
【发布时间】:2017-10-29 23:41:27
【问题描述】:

以下是我如何使用 GraphQL 架构字符串来创建架构并将其附加到我的 Express 服务器:

var graphql = require('graphql');
var graphqlHTTP = require('express-graphql');
[...]
    return graphqlHTTP({
      schema: graphql.buildSchema(schemaText),
      rootValue: resolvers,
      graphiql: true,
    });

这是对模块的所有非常基本的使用。在我想定义一个联合之前,它运行良好并且非常方便:

union MediaContents = Photo|Youtube

type Media {
  Id: String
  Type: String
  Contents: MediaContents
}

我没有找到任何方法来完成这项工作,查询 Contents 完成了它必须做的事情,返回正确的对象但失败并显示消息 Generated Schema cannot use Interface or Union types for execution

在使用 buildSchema 时是否可以使用联合?

【问题讨论】:

    标签: graphql graphql-js


    【解决方案1】:

    这正是我们创建graphql-tools 包的原因,它就像buildSchema 的生产就绪、增压版本:http://dev.apollodata.com/tools/graphql-tools/resolvers.html#Unions-and-interfaces

    您可以通过在联合上提供 __resolveType 方法来简单地使用联合,就像使用 GraphQL.js 一样:

    # Schema
    union Vehicle = Airplane | Car
    
    type Airplane {
      wingspan: Int
    }
    
    type Car {
      licensePlate: String
    }
    
    // Resolvers
    const resolverMap = {
      Vehicle: {
        __resolveType(obj, context, info){
          if(obj.wingspan){
            return 'Airplane';
          }
          if(obj.licensePlate){
            return 'Car';
          }
          return null;
        },
      },
    };
    

    唯一的变化是,使用makeExecutableSchema,而不是提供解析器作为根对象:

    const graphqlTools = require('graphql-tools');
    return graphqlHTTP({
      schema: graphqlTools.makeExecutableSchema({
        typeDefs: schemaText,
        resolvers: resolvers
      }),
      graphiql: true,
    });
    

    另请注意,解析器的签名将与常规 GraphQL.js 样式匹配,因此它将是 (root, args, context),而不仅仅是使用 rootValue 时得到的 (args, context)

    【讨论】:

    • 好吧,我就是这么想的,buildSchema 没办法做到。我想在向项目添加一个依赖项之前确保 :) 另一个问题:我不太了解 resolverMap 的语法,Vehicle 是在这里定义的内联类(我以前从未见过,我更一个 C++ 的人,并且一直在 JS 中感到困惑 :D)
    • 这是一个很好的答案。正是我想要的。
    【解决方案2】:

    如果您要返回一个包含所有信息的对象,您可以在您的对象中添加一个 __typename 字段。像这样:

    return {
      token: res.token,
      user: {
        __typename: 'YOUR_TYPE_HERE',
        ...res.user
      }
    };
    

    【讨论】:

    • 非常感谢。轻松修复!
    猜你喜欢
    • 2017-11-29
    • 2017-09-28
    • 1970-01-01
    • 2017-01-30
    • 2018-10-22
    • 2019-07-02
    • 2018-10-03
    • 2018-02-03
    • 2021-11-30
    相关资源
    最近更新 更多