模式拼接两个远程Prisma / GraphQL模式

时间:2018-07-19 15:42:57

标签: node.js graphql apollo-server prisma graphql-tools

我正在尝试创建一个基于微服务的应用程序,该应用程序使用两个在Docker中运行的远程Prisma / GraphQL模式和一个使用模式缝合对其进行自我检查的网关。

Prisma / GraphQL模式:

// Profile Schema service - http:localhost:3000/profile
type Profile {
  id: ID!
  user_id: ID!
  firstName: String!
  ...
}

type Query {
  findProfileById(id: ID!): Profile
  findProfileByUserID(user_id: ID!): Profile
}

// User Schema service - http:localhost:5000/user
type User {
  id: ID!
  profileID: ID!
  email: String!
  ...
}

type Query {
  findUserById(id: ID!): User
  findUserByProfileID(profileID: ID!): Profile
}

现在在网关服务器中,我能够成功使用graphql-tools进行自省和mergeSchemas,并且添加了扩展类型以允许这两种类型之间的关系

// LinkTypeDefs
extend type Profile {
    user: User
}

extend type User {
   userProfile: Profile
}

我按照Apollo GraphQL文档进行了与远程模式的模式缝合,这是我现在合并的模式的解析器

        app.use('/gateway', bodyParser.json(), graphqlExpress({ schema: mergeSchemas({ 
        schemas: [
            profileSchema,
            userSchema,
            linkTypeDefs
        ], 
        resolvers: mergeInfo =>  ({
            User: {
                userProfile: {
                    fragment: `fragment UserFragment on User { id }`,
                    resolve(user, args, context, info) {
                        return delegateToSchema({
                            schema: profileSchema,
                            operation: 'query',
                            fieldName: 'findProfileByUserId',
                            args: {
                                user_id: user.id
                            },
                            context,
                            info
                        },

                        );
                    },
                },
            },
            Profile: {
                user: {
                    fragment: `fragment ProfileFragment on Profile { id }`,
                    resolve(profile, args, context, info) {
                        return delegateToSchema({
                            schema: authSchema,
                            operation: 'query',
                            fieldName: 'findUserByProfileId',
                            args: {
                                profileID: profile.id
                            },
                            context,
                            info

                        })
                    }
                }
            }
        }),
    })
}));

我遇到的问题是每次我查询用户或个人资料的新扩展字段时,它总是返回null。我确保已使用现有profileId创建了User对象,同样使用具有现有userId的Profile对象也创建了User对象。这是查询结果的一个示例

enter image description here

我已经阅读了大约一个星期的文档,而且似乎没有任何效果。根据我的理解,一切都已正确插入。希望有人可以提供帮助。我感觉它与片段有关。我可以提供用户和个人资料对象的屏幕截图,以便在需要时进行进一步说明。谢谢。

1 个答案:

答案 0 :(得分:0)

我最终通过将委托ToSchema()更改为info.mergeInfo.delegate()解决了该问题。这似乎可以解决问题。

enter image description here

我还没有尝试过新近更新的info.mergeInfo.delegateToSchema。如果更新的版本有效,将更新此帖子,但现在可以为我完成工作。

希望这可以在将来对某人有所帮助!