Схема Сшивание двух удаленных схем Prisma/GraphQL
Я пытаюсь создать приложение на основе микросервиса, которое использует две удаленные схемы Prisma/GraphQL, которые работают в Docker, и шлюз, который анализирует их с помощью сшивания схем.
Схемы 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
})
}
}
}
}),
})
}));
Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я запрашиваю пользователя или профиль для их новых расширенных полей, он всегда возвращает ноль. Я удостоверился, что я создал объект User с существующим profileId, также как с объектом Profile с существующим userId. Это образец результатов запроса
Я просматривал документы около недели, и, похоже, ничего не работает. Насколько я понимаю, все подключено правильно. Надеюсь, кто-то может помочь. У меня есть ощущение, что это как-то связано с фрагментами. Я могу предоставить снимок экрана с пользовательским и профильным объектами для уточнения, если это будет необходимо. Благодарю.
1 ответ
В итоге я решил проблему, изменив делегат ToSchema() на info.mergeInfo.delegate(). Это, казалось, сделало трюк.
Я еще не пробовал недавно обновленный info.mergeInfo.delegateToSchema. Обновлю этот пост, если обновленная версия работает, но пока это делает работу за меня.
Надеюсь, это поможет кому-то в будущем!