Промежуточное ПО для проверки Apollo-server 2 - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу добавить слой проверки на сервер apollo.Он должен запускаться после каждого запроса / мутации graphql, но перед функцией распознавателя.Слой валидации должен знать вызываемый запрос / мутацию graphql и переданные параметры.Она выдаст ошибку, если она недействительна, и предотвратит запуск функции распознавателя.

Мне неясно, куда ее вставить, не помещая ее вручную в каждую функцию распознавателя.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

graphql-tools на самом деле включает в себя утилиту addSchemaLevelResolveFunction, которая позволяет обернуть преобразователь для каждого поля Query, Mutation и Subscription для имитации "преобразователя корневого уровня":

const{makeExecutableSchema, addSchemaLevelResolveFunction} = require ('graphql-tools')

const schema = makeExecutableSchema({ resolvers, typeDefs })
const rootLevelResolver = (root, args, context, info) => {
  // Your validation logic here. Throwing an error will prevent the wrapped resolver from executing.
  // Note: whatever you return here will be passed as the parent value to the wrapped resolver
}
addSchemaLevelResolveFunction(schema, rootLevelResolver)

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

Лучшим подходом является использование пользовательской директивы схемы , как описано в документации .Это позволяет указать, к каким полям применять логику:

directive @customValidation on FIELD_DEFINITION

type Query {
  someField: String @customValidation
  someOtherField: String
}
0 голосов
/ 18 декабря 2018

вы можете добавить свой метод проверки внутри context, где вы также можете получить параметры запроса, запрос, заголовки и т. Д.

Вы также можете рассмотреть возможность реализации пользовательской директивы, которая может применяться на уровне схемы.

ref https://www.apollographql.com/docs/apollo-server/features/authentication.html

...