Apollo Server Stitching - Получить родительский родитель в распознавателе - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть вопросы, основанные на https://www.apollographql.com/docs/graphql-tools/schema-stitching/

Допустим, у меня есть следующие схемы (обратите внимание, что это построено для примера, нет смысла структурировать его таким образом )

//First schema
type User {
  id
  cars: [Car]!
}

type Car {
  id
  name: String
  model: String
}

//Second schema
type Color {
  id
  name: String
  rgb: String
  opacity: Int
}

//Defined in Apollo Server
extend type Car {
  color: Color
}

И следующий преобразователь для

resolvers: {
  Car: {
    color: {
      fragment: '... on Car { id }',
      resolve(parent, args, context, info) {
        return delegateToSchema({
          schema: secondSchema,
          operation: 'query',
          fieldName: 'colorByUserAndCarId',
          args: {
            id: parent.id,
            userId: ?
          },
          context,
          info,
        });
      },
    },
  },
}

Как я могу получить userId, который имеет тип User, а не Car?

Пока я искал ответ на этот вопрос, я думал о некоторых решениях, но не могу понять, как заставить любое из них работать ..

  • Сделать тип Color part из Car, поэтому у меня было бы поле каждого цвета в машине напрямую, так что я думаю, что вместо этого у меня будет преобразователь, основанный на пользователе ..?
  • Изменение фрагмента на '... on User' при работе на типе Car, но пока это не работает.
  • Добавление userId к типу Car путем его расширения, но я все равно не могу найти, как получить userId

Изменение схемы и типов с root не вариант, все изменения должны быть сделаны в Apollo Сервер.

1 Ответ

0 голосов
/ 29 апреля 2020

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

Я могу добавить преобразователь для "автомобиля" так же, как я сделал для "цвета" и с помощью как только я попаду в свой автоколонатор, значение объекта для "автомобиля" уже существует ... значение parent будет выглядеть как { id: x, car: {...}}, id будет userId, так что я могу просто сделать это в моей машине resolver

let myCar = parent.car;
myCar.userId = parent.id;
return myCar;

Когда я буду в моем преобразователе цветов, я смогу сделать parent.userId.

...