В чем программная разница между запросом GraphQL и полем Object? - PullRequest
0 голосов
/ 16 октября 2019

Кто-нибудь знает, как я могу программно дифференцировать запрос в графе и поле? Я говорю об этом:

type User {
  id: ID! <-- this would be a field
}

type Query {
  getUsers: [User]! <-- this would be a query 
}

Я пытался взглянуть на это со всех сторон, но они в значительной степени идентичны, оба имеют тип FieldDefinition и имеют точно такую ​​же структуру. Так есть ли способ сделать это? Я пытаюсь написать директиву схемы auth , которая применяется к обоим и очень похожа, но она должна сделать одно по-другому, если директива была применена к запросу.

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

Ответы [ 2 ]

1 голос
/ 16 октября 2019

GraphQL поддерживает три типа операций - запросы, мутации и подписки. Отдельная схема должна поддерживать запросы, но два других типа являются необязательными. Для каждой операции, которую поддерживает схема, она определяет один тип, который будет служить root этой операции. Мы называем эти три типа корневыми типами операций . По соглашению мы обычно называем эти типы Query, Mutation и Subscription, но они могут иметь и любые другие имена.

При использовании SDL мы указываем, какие типы связаны с каждой операцией, напримерэто:

schema {
  query SomeType
  mutation SomeOtherType
}

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

Если вы используете простой GraphQL.js, тогда корневые типы операций определяются как часть вашего объекта схемы:

const schema = new GraphQLSchema({
  query: SomeType,
  mutation: SomeOtherType,
})

Поскольку Query или Mutation является типом объекта, как и любой другой, важно помнить, что поле наQuery, как getUsers, все еще просто поле. В разговорной речи мы называем эти поля запросами (а поля корневого типа мутации - мутациями), но они по-прежнему являются просто полями.

Однако, учитывая объект GraphQLResolveInfo, вы можете определить, к какому типу относится полеи вы также можете определить три корневых типа операций. Таким образом, вы можете сделать что-то вроде этого:

const { parentType, schema } = info
const isQueryField = parentType === schema.getQueryType()
0 голосов
/ 16 октября 2019

После просмотра каждого возможного консольного журнала, я думаю, что, возможно, нашел его, поэтому, если кому-то интересно:

Запрос с именем getUsers, если он определен следующим образом:

type Query {
  getUsers: [User]!
}

будет иметь parentType из Query. Аналогично мутациям, parentType для этого Mutation. Вы можете получить к нему доступ в резольверах (или директивах, которые расширяют резолверы) следующим образом:

async function resolver(parent, args, context, info) {
  // will be "Query" for queries and `Mutation` for mutations, 
  // and the parent object for anything else, ex. "User" for `type User {}`

  console.log(info.parentType) 
}

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

...