1

我正在使用 NestJS + Prisma + Apollo Federation。

在微服务 A 上定义用户,在微服务 B 上定义帖子。关系是 1 - N,一个用户可以有 N 个帖子。

在 Prisma 中,Post 的数据模型是用用户的字符串定义的,因为 userId 是一个 uuid。

type Post {
  id: Int! @id
  createdAt: DateTime! @createdAt
  updatedAt: DateTime! @updatedAt
  user: String!
}

在生成的模式(使用https://graphql-code-generator.com)中,Post 有一个 User 类型的属性,而这种 User 类型扩展了 id 和一个帖子数组:

type Post @key(fields: "id") {
  id: Int!
  createdAt: DateTime!
  updatedAt: DateTime!
  user: User!
}

extend type User @key(fields: "id") {
  id: ID! @external
  posts: [Post]
}

在 apollo federation 中,所有工作都按预期工作,除非在尝试链接两个微服务之间进行查询。

在操场上,如果您尝试使用其用户查询帖子而不设置子字段,它会破坏架构并说您必须设置用户的子字段,如果您设置子字段,graphql 会响应一条消息,您不能使用子字段,因为它的类型是字符串。

我可以使这项工作正常工作的唯一方法是在 Prisma 中设置字符串类型的 userId 字段,并在模式中设置另一个字段,称为用户类型的用户。但是所有示例都没有显示与 db 一起使用的字段和与 schema 一起使用的字段。

我的问题是这是推荐的还是我错过了什么。

4

1 回答 1

0

为了从中获取UserPost您必须在您的帖子和用户服务中创建一个解析器。

邮政服务

const resolvers = {
  Post:{//before you do this you have to extend User schema which you already did.
      // you are basically asking the 'User' service, which field should be used to query user.
    user: ref => ({ __typename: 'User', id: ref.userId })
  }
  Query:{
    // query resolvers
  },
  Mutation:{
    // mutation resolvers
  }

用户服务

const resolvers = {
  User:{//the code below allows other services to extend User in their own schemas
    __resolveReference: (ref, { userDataLoader }) => userDataLoader.load(ref.id),
  }
  Query:{
    // query resolvers
  },
  Mutation:{
    // mutation resolvers
  }

现在链接数组[Post]必须纯粹在后期服务中完成

邮政服务

const resolvers = {
  Post:{//before you do this you have to extend User schema which you already did.
      // you are basically telling the user service, which field should be used to query user.
    user: ref => ({ __typename: 'User', id: ref.user })
  },
  User:{
    posts:(ref, args, {postDataLoader}) => getOrders(ref.postIds) //or ref.userId(foreign key)
  },
  Query:{
    // query resolvers
  },
  Mutation:{
    // mutation resolvers
  }
于 2020-06-20T04:38:30.937 回答