假设我有以下代码作为graphql架构。一个userType
包括id
和name
用户,还有两种查询: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(...)
)推迟到最后。所以我可以在查询本身添加更多字段,或者修改现有字段。
但我如何修改已定义的类型?基本上,我需要将其他字段添加到userType
和permissions
一样,它本身就是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 });
谢谢!
答案 0 :(得分:0)
我最后做的是在我的应用程序逻辑和GraphQL之间添加另一个层。所以我创建了另一个库来保存有关模式和类型的信息,它有一个API来修改模式中的现有类型。完成所有修改后,我们可以从库中提取GraphQL架构。
这就是整个想法。对于实现细节,我在这里写了一篇文章:Distributed Schema Creation in GraphQL