Схема сшивки двух удаленных схем 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, и я добавил расширенные типы, чтобы разрешить отношения между двумя типами.

// 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. Я убедился, что создал объект User с существующим profileId, а также с объектом Profile с существующим userId. Это образец результатов запроса

Схема сшивки двух удаленных схем Prisma / GraphQL

Я просматривал документы около недели, и, похоже, ничего не работает. Насколько я понимаю, все подключено правильно. Надеюсь, кто-то сможет помочь. У меня такое чувство, что это как-то связано с фрагментами. При необходимости я могу предоставить снимок экрана с объектами пользователя и профиля для более подробного разъяснения. Спасибо.

В ваших преобразователях, особенно для пользовательского поля, у вас есть profile в качестве первого параметра. Вы уверены, что в нем вообще есть какой-нибудь контент? GraphQL обрабатывает поля только в том случае, если корневое содержимое не равно нулю. Так что, возможно, он даже не обрабатывает преобразователь для этого поля и, следовательно, не делегирует схему.

bazaglia 20.07.2018 10:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
525
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В итоге я решил проблему, изменив delegateToSchema () на info.mergeInfo.delegate (). Похоже, это помогло.

Я еще не пробовал обновленную info.mergeInfo.delegateToSchema. Обновлю этот пост, если обновленная версия работает, но пока это работает за меня.

Надеюсь, это поможет кому-то в будущем!

Другие вопросы по теме