Пропуск поля в ответ с помощью GraphQL Apollo - PullRequest
0 голосов
/ 08 мая 2020

Я использую сервер Apollo GraphQL и директивы.

Вот моя простая схема. Обратите внимание на директиву в поле токена, Тип пользователя.

const typeDefs = `
directive @allow(service: String) on FIELD_DEFINITION 

type User {
  email: String!
  pass: String!
  ... other fields here
  token: String  @allow(service: "login")
}

type Mutation {
  login(email: String!, pass: String!): User
}`;

Я хотел бы вернуть поле токена, только если был вызван логин. В противном случае я хотел бы вернуть объект User без поля токена , все, что я мог найти, это выброс исключения или возврат нуля в поле «токен».

class SkipDirective extends SchemaDirectiveVisitor {
  visitFieldDefinition(field, details) {
    const { resolve = defaultFieldResolver } = field;
    field.resolve = async function (...args) {
      // If called in context different from "login"
      // Here I would like to just "delete" the "token" field
      else {
        const result = await resolve.apply(this, args);
        return result;
      }
    };
  }
}

Идеи ?

1 Ответ

0 голосов
/ 08 мая 2020

Если поле запрошено, оно должно быть возвращено либо со значением, соответствующим типу поля, либо со значением null. В противном случае вы нарушите spe c.

Невозможно изменить это поведение с помощью директивы схемы. Директива определения поля может изменить поведение среды выполнения только путем изменения преобразователя поля. Однако к моменту вызова резолвера набор выбора уже определен, поэтому уже слишком поздно его изменять. Возврат null или выдача ошибки - почти единственные два варианта.

Вы могли бы реализовать какое-то обходное решение с помощью параметра formatResponse или настраиваемого плагина. Однако, поскольку такое поведение нарушит SPE c, нельзя сказать, не вызовет ли это проблем с клиентскими библиотеками или другими инструментами.

...