问题描述
我有一组 graphql 服务,这些服务使用 graphql-tools
模式拼接在网关中组合在一起。
以下是一些示例代码供参考:
async function makeGatewaySchema() {
// define the remote executors,introspect the subschemas,etc.
return stitchSchemas({
subschemas: [
{
schema: postSubschema,executor: postExecutor,batch: true,},{
schema: userSubschema,executor: userExecutor,],typeDefs: `
...
extend type User {
posts: [Post]
batchPostsJSON: JSON
batchPosts: [Post]
}
...
`,resolvers: {
User: {
posts: {
selectionSet: "{ id }",resolve(user,args,context,info) {
return delegateToSchema({
schema: schemaPost,operation: "query",fieldName: "postsByUserId",args: { id: user.id },info,});
},batchPostsJSON: {
selectionSet: "{ id }",info) {
return batchDelegateToSchema({
schema: schemaFavorite,fieldName: "postsByUserIds",key: user.id,argsFromKeys: (ids) => ({ ids }),valuesFromResults: (results,keys) => {
return keys.map((id) => {
return results.filter((f) => f.user_id === id);
});
},batchPosts: {
selectionSet: "{ id }",info) {
return batchDelegateToSchema({
schema: schemaPost,keys) => {
// doesn't matter,we don't get here
},});
}
在上面的示例代码中,我有三种方法可以获取与用户关联的帖子:
1:User.posts
这工作正常,但没有批量
2:User.batchPostsJSON
这是非常好的批处理,并且可以完美地解决一个问题:JSON
返回类型不允许我查询 Post
字段 - 无论如何我都会得到所有这些字段。更糟糕的是,如果 Post
与第三种类型有关,我将无法遵循这种关系。
3:User.batchPosts
这允许我查询 Post
的字段,但抛出异常 - 我已将返回类型定义为 Post
数组,但是 JSON
是返回的内容,我得到网关错误。
有没有办法处理子模式返回的 JSON 并假装我真的得到 [Post]
代替?当我的 valueFromResults
完成时,这就是它的样子。问题是我的 typedef 和实际解析器之间的返回类型不匹配会在我有机会重新格式化返回值之前引发错误。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)