Псевдоним полей в Apollo GraphQL Server - PullRequest
0 голосов
/ 08 апреля 2020

Псевдоним очень удобен и отлично работает, когда задается псевдоним определенного резольвера c. Например:

{
  admins: users(type:"admin"){
    username
  }
  moderators: users(type:"moderators"){
    moderators
  }
}

Я не уверен, как обрабатывать псевдонимы самих полей. Например:

{
  site_stats {
    hits: sum(field: "hits")
    bounces: sum(field: "bounces")
  }
}

Если распознаватель возвращает любое значение sum, одно и то же значение связывается с именами как hits, так и bounces (что имеет смысл, поскольку только одно значение суммы может быть даже возвращается). Если я заставлю распознаватель использовать псевдонимы в качестве имен полей при возврате результатов, hits и bounces оба станут null.

Я мог бы просто разбить эти поля на отдельные распознаватели, но это усложняет интеграцию для разработчиков переднего конца. Мы также потеряли бы массу преимуществ в плане эффективности, поскольку я могу объединить все данные, необходимые в одном запросе, к нашему источнику данных (мы используем ElasticSearch).

Любая помощь от ваших гениев будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Использование псевдонимов и отдельных полей имеет очень ограниченное удобство использования.

Вы можете использовать сложные фильтры (входные параметры), например список возвращаемых ключей и связанные с ними параметры, например

[{name:"hits", range:"month"}, 
{name:"bounces", range:"year"}]

С запросом - ожидаемая структура

{
  stats {
    name
    sum
    average
  }
}

Обязательные поля могут различаться, например, только name и sum.

Вы можете вернуть массивы объекта fe

{ stats: [
  { name:"hits", 
    sum:12345, 
    average: 456 }

Здесь можно использовать псевдонимы для выбора различных наборов данных, таких как name и sum для hits, bounces дополнительно с average.

... больше декларативный?

PS. Нет ничего, что "усложняло бы интеграцию для разработчиков переднего конца". Результат json, может быть преобразован / преобразован / адаптирован после выборки (cl inet side) при необходимости.

1 голос
/ 08 апреля 2020

Похоже, вы помещаете все свои логи c в распознаватель root -уровня (site_stats) вместо того, чтобы предоставлять преобразователь для поля sum. Другими словами, если ваши резольверы выглядят так:

const resolvers = {
  Query: {
    site_stats: () => {
      ...
      return { sum: someValue }
    },
  },
}

, вы должны вместо этого сделать что-то вроде:

const resolvers = {
  Query: {
    site_stats: () => {
      return {} // empty object
    },
  },
  SiteStats: {
    sum: () => {
      ...
      return someValue
    },
  },
}

Таким образом, вы не передадите значение для суммы из parent и полагаясь на распознаватель по умолчанию - вы явно указываете значение sum внутри его преобразователя. Поскольку распознаватель sum будет вызываться отдельно для каждого псевдонима с аргументами, указанными c для этого псевдонима, каждый псевдоним будет разрешаться соответствующим образом.

...