gpt4 book ai didi

graphql - 如何在 GraphQL buildSchema 中使用联合

转载 作者:行者123 更新时间:2023-12-04 22:51:43 27 4
gpt4 key购买 nike

以下是我使用 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-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)而不仅仅是 (args, context)这是您使用 rootValue 时得到的结果.

关于graphql - 如何在 GraphQL buildSchema 中使用联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44246290/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com