Вложенный запрос GraphQL с аргументом массива - PullRequest
0 голосов
/ 17 июня 2019

Я использую apollo-datasource-rest с apollo-server-lambda и пытаюсь выяснить, как сопоставить запрос с определенным преобразователем.У меня есть следующая схема, в которой запрос plan должен возвращать список пользователей (который должен управляться запросом users, а не запросом user).

  type Query {
    user(user_id: String, username: String): User
    users(user_ids: [String!]): [User!]
    plan(plan_id: String): Plan
  }

  type User {
    id: String
    username: String
    first: String
    last: String
    image: String
  }

  type Plan {
    title: String
    image: String
    attending: [User]
  }

Источник данных plan распознавателя запросов выглядит следующим образом:

planReducer(data) {
  return {
    image: data.public.info.image,
    title: data.public.info.title,
    attending: Object.keys(data.public.attending)
  }
}

data.public.attending в planReducer возвращает массив user_id s, который я бы хотел затем передать в мой users запрос в отличие от моего user запроса.

Это мои текущие преобразователи:

user: (_, { username }, { dataSources }) =>
  dataSources.userData.getUserByUsername({ username: username }),
users: async (_, { user_ids }, { dataSources }) => {
  const usersArray = await dataSources.userData.getUsersByIds({ userIds: user_ids })
  return usersArray
},
plan: async (_, { plan_id }, { dataSources }) => {
  return dataSources.planData.getPlanById({ planId: plan_id })
}

1 Ответ

1 голос
/ 19 июня 2019

Ваша карта распознавателя должна выглядеть следующим образом:

const resolvers = {
  Query: {
    plan: async (_parent, { plan_id: planId }, { dataSources }) => (
      dataSources.planData.getPlanById({ planId })
    )
  },
  Plan: {
    users: async ({ user_ids: userIds }, _variables, { dataSources }) => (
      dataSources.userData.getUsersByIds({ userIds })
    )
  }
}

Каждый ключ в Query должен быть преобразователем, который соответствует запросу, определенному в корне Query вашей схемы.Ключи, которые являются прямыми дочерними элементами корня, в данном случае Plan, будут использоваться для разрешения их соответствующих типов при возврате из распознавателя plan в Query.

Если преобразователи не определены, GraphQLобратится к распознавателю по умолчанию, который в этом случае выглядит следующим образом:

const resolvers = {
  Plan: {
    title: (parent) => parent.title,
    image: (parent) => parent.image,
  }
}

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

...