如何使用GraphQL buildSchema的联合

时间:2017-05-29 15:45:16

标签: graphql graphql-js

以下是我使用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时是否可以使用联合?

2 个答案:

答案 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
  }
};