我有两个目标:
- 在任何有趣的数据库上启动 postgraphile 服务
- 创建一个网关,将这些服务组合成一个仍然高性能的图形(具体来说,我对批量查询感兴趣)
从我所做的阅读来看,似乎有两种主要方法:
我已经尝试过每一个,但我目前正在使用模式拼接方法。假设我有一个服务公开的用户和另一项服务公开的帖子:
[user subschema]
type User {
id: ID!
name: String!
}
[post subschema]
type Post {
id: ID!
userId: ID!
content: String!
}
现在假设我要查询所有用户并获取每个用户的帖子列表。如果这两者都是由同一个服务实现的,Postgraphile 将足够聪明地将请求批处理在一起。但由于他们在不同的服务中,我需要做一些工作来实现这一点:
- 在网关中,我需要将我的更新
delegateToSchema
为batchDelegateBySchema
batchPosts: {
selectionSet: "{ id }",
resolve(user, args, context, info) {
return batchDelegateToSchema({
schema: postsSubSchema,
operation: "query",
fieldName: "postsByUserIds",
key: user.id,
argsFromKeys: (ids) => ({ ids }),
valuesFromResults: (results, keys) => {
return keys.map((id) => {
return results.filter((f) => f.user_id === id);
});
},
context,
info,
});
}
}
- 在 postgraphile 服务上,我需要添加一个
favoritesByUserIds
解析器,它接收用户 ID 列表并返回每个用户的收藏夹
这很好用,但是对于我想要有效查询的类型之间的每一种关系,似乎需要做很多工作——我错过了什么吗?有没有更自然的方法来配置网关/postgraphile 子模式以自动处理查询批处理?
注意:我已经batch: true
为网关和enableQueryBatching: true
postgraphile 服务上的每个子模式进行了配置。