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

Posted

技术标签:

【中文标题】模式拼接两个远程 Prisma/GraphQL 模式【英文标题】:Schema Stitching two remote Prisma/GraphQL schemas 【发布时间】:2018-12-27 20:10:40 【问题描述】:

我正在尝试创建一个基于微服务的应用程序,该应用程序使用在 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 进行自省和合并模式,并且我添加了扩展类型以允许两种类型之间的关系

// 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 对象。这是查询结果的示例

我已经浏览了大约一周的文档,但似乎没有任何效果。据我了解,一切都已正确插入。希望有人可以提供帮助。我有一种感觉,它与碎片有关。如果需要,我可以提供用户和配置文件对象的屏幕截图以进行更多说明。谢谢。

【问题讨论】:

在您的解析器中,特别是对于用户字段,您将profile 作为第一个参数。你确定它有任何内容吗? GraphQL 仅在根内容不为空时处理字段。所以也许它甚至没有处理这个字段的解析器,因此它没有委托模式。 【参考方案1】:

我最终通过将 delegateToSchema() 更改为 info.mergeInfo.delegate() 解决了这个问题。这似乎起到了作用。

我还没有尝试过新更新的 info.mergeInfo.delegateToSchema。如果更新的版本有效,将更新这篇文章,但现在这对我有用。

希望这可以帮助将来的人!

【讨论】:

以上是关于模式拼接两个远程 Prisma/GraphQL 模式的主要内容,如果未能解决你的问题,请参考以下文章

将 primsa 模式导入 graphql 模式

Apollo 和 Prisma Graphql 显式模型关系不可查询

如何使用 prisma (graphql) 集群

NestJS 中与 GraphQL 的 Prisma 自关系

Prisma GraphQL-Yoga:解析器需要异步吗?

Prisma graphql updateNode 突变