Apollo Graphql изменить входные данные - PullRequest
1 голос
/ 19 октября 2019

В Apollo Server можно использовать директиву схемы для реализации промежуточного программного обеспечения для распознавателя, например:

adminGetUsers(getUsersPL: GetUsersPL!): [User] @hasRole(role: "ADMIN")

@hasRole(role: "ADMIN") служит промежуточным программным обеспечением для предотвращения использования этой мутации любым пользователем без прав администратора.

Итак, как можно санировать / преобразовывать входные данные? Например,

getUser(userId: String! @transform): [User]

@transform примет userId в качестве хешированного идентификатора (то есть: xyfd) и преобразует его в пронумерованный идентификатор (то есть: 12). Этот синтаксис не допускается, конечно. По сути, я хочу изменить входные данные, прежде чем они перейдут в распознаватель.

1 Ответ

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

На самом деле - это правильный синтаксис. Вы можете определить директиву, которая применяется к определениям аргументов следующим образом:

directive @test on ARGUMENT_DEFINITION

type Query {
  foo(input: String @test): String
}

Директивы схемы не являются промежуточным программным обеспечением. Это просто способы изменения отдельных определений внутри вашей схемы. Чаще всего они используются для изменения определений field , но вы можете изменять другие определения, такие как типы объектов, типы входных объектов, перечисления, объединения и т. Д. При использовании директивы с полем вы можете обернуть существующее разрешениефункционировать внутри другого (или полностью заменить его) - при этом мы можем создать «промежуточное программное обеспечение» для распознавателей. Однако это не является целью директив схемы.

Кроме того, вы не можете использовать директиву аргумента для изменения значения передаваемого аргумента. В лучшем случае вы можете изменить тип аргумента на что-то другое (например, пользовательский скаляр). Тем не менее, вы можете просто использовать директиву поля, чтобы сделать то, что вы пытаетесь выполнить:

class ExampleDirective extends SchemaDirectiveVisitor {
  public visitFieldDefinition(field) {
    const { resolve = defaultFieldResolver } = field
    field.resolve = async function (
      source,
      args,
      context,
      info,
    ) {
      args.someArg = doSomething(args.someArg)
      return resolve.call(this, source, args, context, info);
    }
  }
}
...