在运行时修改GraphQLObjectType字段

时间:2017-01-03 19:14:25

标签: javascript graphql graphql-js

假设我有以下代码作为graphql架构。一个userType包括idname用户,还有两种查询:allUsers: [userType]user(id: Int!): userType

let db = [{
  id: 1,
  name: 'Amir'
}, {
  id: 2,
  name: 'John'
}];

const userType = new GraphQLObjectType({
  name: 'User',
  fields: {
    id: { type: GraphQLInt },
    name: { type: GraphQLString }
  }
});


const queryType = new GraphQLObjectType({
  name: 'Query',
  fields: {
    allUsers: {
      type: new GraphQLList(userType),
      resolve: () => db
    },
    user: {
      type: userType,
      args: {
        id: { type: new GraphQLNonNull(GraphQLInt) }
      },
      resolve: (_, { id }) => db.find(user => user.id == id);
    }
  }
})

let schema = new GraphQLSchema({ query: queryType });

我需要在启动时修改此结构。我的意思是在实际执行最后一行之前。

要添加更多类型的查询,我会在完成所有修改后将模式创建(new GraphQLSchema(...))推迟到最后。所以我可以在查询本身添加更多字段,或者修改现有字段。

我如何修改已定义的类型基本上,我需要将其他字段添加到userTypepermissions一样,它本身就是GraphQLObjectType并且有自己的resolve函数。

这样的事情:

let queryFields = {};

const userType = new GraphQLObjectType({
  name: 'User',
  fields: {
    id: { type: GraphQLInt },
    name: { type: GraphQLString }
  }
});
queryFields['allUsers'] = {
  type: new GraphQLList(userType),
  // ...
}
queryFields['user'] = {
  type: userType,
  //...
}

/* HERE <---------------------------------------- */
userType.fields.permission = {
  type: GraphQLString,
  resolve: user => getPermissionsFor(user);
}


const queryType = new GraphQLObjectType({
  name: 'Query',
  fields: queryFields
})

var schema = new GraphQLSchema({ query: queryType });

谢谢!

1 个答案:

答案 0 :(得分:0)

我最后做的是在我的应用程序逻辑和GraphQL之间添加另一个层。所以我创建了另一个库来保存有关模式和类型的信息,它有一个API来修改模式中的现有类型。完成所有修改后,我们可以从库中提取GraphQL架构。

这就是整个想法。对于实现细节,我在这里写了一篇文章:Distributed Schema Creation in GraphQL