Аргумент в обороте GraphQL - PullRequest
       2

Аргумент в обороте GraphQL

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

Я изучал GraphQL, если быть точным, я следовал курсу удемей Стивена Гриндера.

В своем видео он использовал 3-й аргумент в revolve

resolve(parent, args, request) {

объект запроса содержит детали, например, к какому маршруту он пытался получить доступ, строку запроса и тело и т. Д. (Используется вАутентификация)

Что я нашел немного неопределенным объяснением

Так что я погуглил и прочитал это со страницы graphQL

Этот пример написан на JavaScriptОднако серверы GraphQL могут быть построены на разных языках.Функция распознавателя получает четыре аргумента:

obj Предыдущий объект, который для поля в корневом типе запроса часто не используется.

args Аргументы, предоставленные полю в запросе GraphQL.

context Значение, которое предоставляется каждому распознавателю и содержит важную контекстную информацию, такую ​​как зарегистрированный в данный момент пользователь или доступ к базе данных.

info Значение, которое содержит специфичную для поля информацию, относящуюся к текущему запросу, а также сведения о схеме, для получения дополнительной информации также обратитесь к типу GraphQLResolveInfo.

Теперь я не могу понять, когда нам нужно использовать контекст / запрос?поскольку он используется в мутации, у меня есть ощущение, что он передаст информацию из graphQL в мой passport-express (поскольку наше действительное намерение на этом маршруте - получить входные данные из внешнего интерфейса и передать их в локальную стратегию passport)

Но, согласно определению, похоже, что он используется для передачи информации из express в graphQL

Кроме того, так как я наткнулся на документы GraphQl, я также увидел информациючто я снова не смог понять.

Так может кто-нибудь объяснить мне контекст и информацию в graphQL?

1 Ответ

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

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

Я проверяю токены и добавляю моего пользователя в запрос, а затем передаю моего пользователя в контекст, как показано ниже.

const server  = new ApolloServer({schema: schema(), context: ({req}) => ({context: 
req.user})});

Тогда у меня есть все пользовательские данные, доступные на моем одноразовом компьютере:

 saveChat: async (root, {chat}, {context, pubsub}) => {
  const user = context || null;
  chat.author = user._id ? user._id : null;
  return new ChatModel({...chat}).save();
},

Я также тестировал некоторые вещи pubsub и также отправлял их через контекст.

Это также может быть удобнопри использовании директив graphql для определения ролей и полномочий:

hasRole(next, src, {roles}, {context}) {
 if (!context) { throw new Error('Must be Authenticated at least.'); }
 let valid  = false;
 roles.forEach((role) => { valid = !valid ? _.includes(context.roles, role) : 
 valid; });
 return valid ? next() : new Error(`Missing correct role to perform this task, you 
 have roles: ${context.roles}`);
},

А в Graphql:

 directive @hasRole(roles: [String]) on FIELD_DEFINITION

 saveChat(chat: ChatSaveInput!): Chat @hasRole(roles: ["admin"])

Это свободно основано на статьях Райана Ченки, который немного поработал с & graphqlСтоит посмотреть.

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