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

введите здесь описание изображения

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


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


Ответы (1)


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

введите здесь описание изображения

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

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

person remedy    schedule 12.08.2018