Директива условного обязательного поля GraphQL

Большая часть моей проверки ввода доступна на уровне GraphQL. Я хотел бы улучшить его, сделав определенные поля обязательными, если другие поля имеют определенные значения. Я думаю, что это можно было бы сделать с помощью пользовательских директив, но после небольшого эксперимента я все еще не уверен. Можно ли получить доступ к значению одноуровневого поля в директиве поля?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
5
0
967
1

Ответы 1

Трудно сказать, подходит ли это вашему конкретному сценарию без дополнительного контекста, но, надеюсь, это поможет:

Ваша директива будет иметь примерно такой вид:

export class MyDirective extends SchemaDirectiveVisitor {
  visitFieldDefinition(field) {
    const { resolve = defaultFieldResolver } = field;
    const directiveArgs = { ...this.args };
    field.resolve = async function(obj, args, context, info) {
    ...

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

например для схемы, которая имеет:

type MyType {
  foo: String
  bar: String @MyDirective
}

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

export class MyDirective extends SchemaDirectiveVisitor {
  visitFieldDefinition(field) {
    const { resolve = defaultFieldResolver } = field;
    const directiveArgs = { ...this.args };
    field.resolve = async function(obj, args, context, info) {
    let result = resolve.call(this, result, args, context, info);
    if (obj.foo === "something" && result === null) throw new Error("Some error");
    return result

Это для возвращаемых типов. Мне нужна проверка типов ввода:]

Avius 29.12.2019 16:20

Другие вопросы по теме