Как должна быть схема отношений между микросервисами - PullRequest
0 голосов
/ 28 апреля 2020

Я использую Nest JS + 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 расширяет идентификатор и массив сообщений:

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

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

В федерации Аполлона все работает, как и ожидалось, за исключением случаев, когда выполняется запрос, пытающийся установить связь между обоими микросервисами.

На игровой площадке, если вы пытаетесь запросить посты со своим пользователем, не задавая подполя, он нарушает схему и говорит, что вы должны установить Подполя пользователя, и если вы установите подполя, graphql ответит сообщением, что вы не можете использовать подполя, потому что его тип - String.

Единственный способ, которым я мог сделать эту работу правильно, это установить в Prisma поле userId введите строку и установите другое поле в схеме с именем пользователя типа User. Но во всех примерах не было показано поле для работы с БД и поле для работы со схемой.

У меня вопрос: рекомендуется ли это или я что-то упустил?

...