【发布时间】:2017-07-25 01:48:08
【问题描述】:
假设我有以下代码作为 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 });
谢谢!
【问题讨论】:
-
source code of GraphQLObjectType 表示无法进行运行时修改。这些字段在创建时是固定的。
标签: javascript graphql graphql-js