在运行时修改 GraphQLObjectType 字段
Modify GraphQLObjectType fields at runtime
假设我有以下代码作为 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 });
谢谢!
最后我所做的是在我的应用程序逻辑和 GraphQL 之间添加另一层。所以我创建了另一个库来保存关于模式和类型的信息,它有一个 API 来修改模式中的现有类型。完成所有修改后,我们可以从库中提取 GraphQL 模式。
这就是整个想法。对于实现细节,我在这里写了一个post:Distributed Schema Creation in GraphQL
假设我有以下代码作为 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 });
谢谢!
最后我所做的是在我的应用程序逻辑和 GraphQL 之间添加另一层。所以我创建了另一个库来保存关于模式和类型的信息,它有一个 API 来修改模式中的现有类型。完成所有修改后,我们可以从库中提取 GraphQL 模式。
这就是整个想法。对于实现细节,我在这里写了一个post:Distributed Schema Creation in GraphQL