Как установить параметр поля внутри резольвера - PullRequest
0 голосов
/ 23 сентября 2018

У меня проблема с ограничением моей конечной точки 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

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

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 помещает имя пользователя в корневой раздел Tag, а не в дочерний элемент (оператор @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' не имеет никакого эффекта, так как распознаватели полей вызываются, когда данные уже извлечены.

1 Ответ

0 голосов
/ 25 сентября 2018

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

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

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

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

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

...