以下是我使用GraphQL架构字符串创建架构并将其附加到Express服务器的方法:
setDT(new_df)[, index_col := cumsum(c(TRUE, abs(diff(colA))> 1))
][, colB := .N , index_col]
new_df
# colA colB index_col
# 1: 3 10 1
# 2: 3 10 1
# 3: 3 10 1
# 4: 2 10 1
# 5: 2 10 1
# 6: 2 10 1
# 7: 2 10 1
# 8: 1 10 1
# 9: 1 10 1
#10: 1 10 1
#11: 71 7 2
#12: 71 7 2
#13: 70 7 2
#14: 70 7 2
#15: 70 7 2
#16: 69 7 2
#17: 69 7 2
#18: 90 7 3
#19: 90 7 3
#20: 89 7 3
#21: 89 7 3
#22: 89 7 3
#23: 88 7 3
#24: 88 7 3
#25: 44 2 4
#26: 43 2 4
#27: 120 1 5
#28: 100 1 6
这是模块的所有非常基本的用法。它运行良好,非常方便,直到我想定义一个联合:
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
}
。
使用buildSchema时是否可以使用联合?
答案 0 :(得分:7)
这正是我们创建graphql-tools
包的原因,就像buildSchema
的生产就绪,增压版本:http://dev.apollodata.com/tools/graphql-tools/resolvers.html#Unions-and-interfaces
您可以通过在union上提供__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
。
答案 1 :(得分:1)
如果要返回包含所有信息的对象,可以在对象中添加__typename字段。像这样:
return {
token: res.token,
user: {
__typename: 'YOUR_TYPE_HERE',
...res.user
}
};