Федерация Аполлона: заменяет ли Федерация delegateToSchema?
Краткая версия: Могу ли я использовать Apollo Federation для замены функциональностиdelegateToSchema
, и если да, то как? Идея состоит в том, чтобы повторно использовать логику преобразователя из другого сервиса, который является черным ящиком.
Длинная версия:
Я часами рыскал по Интернету, пытаясь понять, как объединить две службы без явного написания нового преобразователя. Аполлон неопределенно говорит, что вы можете перейти от сшивки схемы к федерации, но рассмотрим этот пример:
type User @key(fields: "username"){
username: ID!
photos: [Photo] @provides(fields: "created_by")
}
extend type Photo @key(fields: "id") {
id: ID! @external
created_by: ID! @external # I want to match this with username
}
Я использую PostGraphile для преобразования моей базы данных в схему GraphQL со всеми необходимыми преобразователями для CRUD. Уже есть запрос, с помощью которого я могу получить фотографии для конкретного пользователя:
allPhotos(condition: {created_by: $username}) { ... }
Это существует в другом сервисе, который я рассматриваю как черный ящик. Не идеально (или просто) написать новый преобразователь вручную, тем более, что данные есть, мне просто нужно сказать Apollo, как их получить. Я подумал, может, я смогу использоватьdelegateToSchema
:
delegateToSchema({
schema: pgSchema,
operation: 'query',
fieldName: 'allPhotos(condition: {created_by: $username})',
args: { username: args.username },
context: context,
info: info
})
Но из того, что я вижу в документах и статьях, это сшивание схемы, которое предполагается заменить федерацией. В идеале я бы хотел использовать для этого только федерацию, если это возможно. Является ли это возможным? В документации это не проясняется, и каждый пример, который я видел с федерацией, по-прежнему требует, чтобы вы написали собственный преобразователь. Это почти как если бы директивы просто подсказывали, чтобы убедиться, что у вас есть правильные поля в ваших преобразователях, вместо того, чтобы фактически выполнять какую-либо логику.
Любая помощь приветствуется!
1 ответ
Возможно. Твойcreated_by
должен быть User, а не ID!, и вам нужно исключить User в сервисе, реализующем Photo.