Как установить параметр поля внутри резолвера

У меня проблема с ограничением моей конечной точки graphql для обслуживания только тех данных, которые запрашивающий пользователь может запрашивать

я использую

apollo-server 2.1.0
express 4.16.3
graphql 0.13.2
graphql-tools 4.0.0
neo4j-graphql-js 0.2.1

Тип Ярлык имеет поле элементы, которое должно содержать только те элементы, которыми владеет текущий пользователь.

type Tag {
  name: String!
  elements(username:String): [Element] @cypher(statement: "MATCH (this)-[:TAGGED]-(e:Element)-[:OWNER]-(u:User) WHERE u.name=$username RETURN e")
}

type Element {
  uuid: String!
  name: String
  users: [User] @relation(name:"OWNER", direction:"IN")
  tags: [Tag] @relation(name:"TAGGED", direction:"IN")
  responses: [Element] @relation(name:"RESPONSE", direction:"OUT")
}

Когда мой запрос выглядит так:

{
Tag{
    name,
    elements(username:"crmue"){
      name
    }
  }
}

Результат выглядит ожидаемым. Но я хочу проверить и установить аргумент имени пользователя в преобразователе на основе привязанного к контексту пользователя.

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

params['username'] = ctx.user.name;

В этом случае сгенерированный оператор cypher помещает агрумент имени пользователя в раздел корневого тега, а не в раздел дочернего элемента (оператор @cypher). Но я понятия не имею, как установить аргумент имени пользователя для элементов поля Tag в преобразователе до того, как данные будут извлечены.

Так что я надеюсь, что у кого-то есть идея, как решить мою проблему, или есть идея получше, чем мое решение здесь с оператором @cypher.

Спасибо!

ОБНОВИТЬ

Мои текущие базовые преобразователи:

export const resolvers = {

  Tag : {
    elements : (object, params, ctx, resolveInfo) => {
      params["username"] = ctx.user.name;

    }
  },

  Query: {
    User(object, params, ctx, resolveInfo) {
      return neo4jgraphql(object, params, ctx, resolveInfo);
    },
    Element(object, params, ctx, resolveInfo) {
      return neo4jgraphql(object, params, ctx, resolveInfo);
    },

    Tag(object, params, ctx, resolveInfo) {
      if (!ctx.user){
       throw Error("Wrong request");
      }
      params["username"] = ctx.user.name;
      return neo4jgraphql(object, params, ctx, resolveInfo); 
    },

  }
};

Добавление параметра в преобразователь поля 'elements' не имеет никакого эффекта, поскольку преобразователи полей вызываются, когда данные уже получены.

использовать ctx.user.name непосредственно в преобразователе elements?

xadm 24.09.2018 21:56

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

crmue 25.09.2018 09:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
291
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обычно корневой преобразователь не возвращает весь объект, а только «собственные поля», оставляя связанные поля для обработки преобразователями полей. В этом случае похоже, что neo4jgraphql (я предполагаю, что я не использовал его) достаточно умен, чтобы обрабатывать его полностью на корневом уровне.

Если params["username"] = ctx.user.name; в Tag не работает, то похоже, что neo4jgraphql не заботится о params (IMHO, это должно - проблема?) И работает непосредственно с аргументом info преобразователя (уже существующие переменные).

Попробуйте добавить username в массив variableValues. Пояснения В этом случае преобразователь поля не требуется.

Второй вариант: удалить elements из fieldNodes (в преобразователе Tag) и использовать преобразователь полей (params / variableValues).

Если проблема не устранена, проверьте / запишите состояние / значения info.

neo4j-graphql-js пытается получить все за один проход в базу данных в корневом преобразователе тегов. Директива @cypher поля elements используется для построения этого единственного зашифрованного оператора. Я решил свою проблему с помощью вашего совета по изменению значений аргументов в информации о восстановлении. Это не совсем удобно, но работает.

crmue 25.09.2018 12:29

Создал проблему на github для neo4j-graphql-js см. ссылка на выпуск №112

crmue 26.09.2018 12:50

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