GraphQL извлекается, только если в запросе запрашивается определенное поле - PullRequest
0 голосов
/ 06 апреля 2020

Очень базовая c схема:

type Foo {
    id: String!
    name: String!
    createdAt: Date!
    bars: [Bar]
}

type Bar {
    id: String!
    name: String!
    fooId: String!
}

Тогда моя карта Resolver:

Query: {
    foo: 
      async (
        _: any,
        { id }: { id: string }
      ) => {

        const { data: fooObj } = await httpRequest({
          url: `/api/foos/${id}`
        });

        const barsResponse = await httpRequest({
          url: `/api/bars/?fooId=${id}`
        });
        const response = {
          ...fooObj.foo,
          bars: barsResponse.data.bars
        };
        return response;
      }
 }

Если пользователь выполняет следующий запрос:

{
  foo(id: "123456"){
    bars {
      name
    }
  }
}

Средство распознавания запросов правильно выбирает и возвращает правильные данные в правильной форме, однако, выполняя этот запрос:

{
  foo(id: "123456"){
    name
  }
}

В идеале не будет 2-го запроса на выборку, чтобы получить bars. Как разделить Quol Resolver так, чтобы он запускал выборку Bars, только если запрос содержит bars?

1 Ответ

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

Да, переместите логи извлечения c в распознаватель для bars:

const resolvers = {
  Query: {
    foo: () => {...},
  },
  Foo: {
    bars: ({ id }) => {
      const { data: { bars } } = await httpRequest({
        url: `/api/bars/?fooId=${id}`
      })
      return bars
    },
  },
}

Первый параметр, передаваемый каждому распознавателю, - это значение, в котором разрешено родительское поле. Пока то, что возвращается внутри резольвера для Query.foo, включает id, это будет доступно для резольвера для Foo.bars.

Резолвер поля не вызывается, пока это поле не запрошено (и родительское поле не разрешается в ноль). Таким образом, ваш вызов /api/bars будет инициирован только в том случае, если поле присутствует в запросе.

Также возможно продолжить выборку всего на уровне root, если хотите. Четвертый параметр, передаваемый распознавателю, - это объект GraphQLResolveInfo, который будет содержать информацию о запросе, включая поля, которые были запрошены. Вы можете разобрать этот объект, и ваш распознаватель root будет вести себя соответствующим образом. Для более простого сценария ios, подобного этому, это излишне.

...