Поля GraphQL не определены - PullRequest
0 голосов
/ 12 января 2019

Начиная со стека GraphQL / Node / Express / Typescript, я сталкиваюсь с проблемой, когда аргументы поля не передаются функции распознавателя. У меня есть два запроса:

UserList:

UserList: {
        type: new GraphQLList(UserType),
        args: {
            userName: {
                type: GraphQLString
            },
            userIsLocked: {
                type: GraphQLBoolean
            },
            userIsConfirmed: {
                type: GraphQLBoolean
            },
            userAwaitingPassword: {
                type: GraphQLBoolean
            }
        },
        resolve: ((_, {fields}) => new User().where({fields}))
    }

И пользователь:

User: {
    type: UserType,
    args: {
        userId: {
            type: GraphQLID
        }
    },
    resolve: ((_, {userId}) => new User().getById({userId}))
}

Функция User().where() по умолчанию отображает всех пользователей, если не указан критерий. Однако рассмотрим следующий запрос и результаты:

query All {
  UserList(userIsLocked:true){
    userId
    userName
    userIsLocked
  }
}

// Results
{
  "data": {
    "UserList": [
      {
        "userId": "a4f1d968-52d6-4148-bf62-1e132a4defde",
        "userName": "user1",
        "userIsLocked": false
      },
      {
        "userId": "b42a1170-096a-11e9-b568-0800200c9a66",
        "userName": "administrator",
        "userIsLocked": false
      }
    ]
  }
}

Очевидно, что userIsLocked не передается аргумент fields в функции where(). Тем не менее, следующие работы:

query Individual {
  User(userId: "a4f1d968-52d6-4148-bf62-1e132a4defde") {
    userId
    userName
    userIsLocked
  }
}

// Results
{
  "data": {
    "User": {
      "userId": "a4f1d968-52d6-4148-bf62-1e132a4defde",
      "userName": "user1",
      "userIsLocked": false
    }
  }
}

Когда userId регистрируется по запросу к getById(), я вижу {"userId":"a4f1d968-52d6-4148-bf62-1e132a4defde"} в консоли. Но когда fields регистрируется по запросу к where(), все, что отображается в консоли, это undefined, и мой запрос по умолчанию отображает всех пользователей. Я не могу понять, почему два, по-видимому, равных запроса будут вести себя по-разному. Я изучил документацию по GraphQL, но все, что я могу найти, это примеры запросов и общая структура запросов.

1 Ответ

0 голосов
/ 12 января 2019

Второй аргумент, переданный функции resolve, является объектом, свойства которого сопоставляются с аргументами для этого поля. Давайте посмотрим на рабочий преобразователь:

resolve: (_, {userId}) => new User().getById({userId})

Здесь вы используете синтаксис деструктурирования объекта , чтобы распаковать свойство userId из второго параметра и подписать его для переменной с тем же именем. Затем вы используете сокращенный синтаксис имени свойства для создания объекта со свойством userId (со значением определенной вами переменной userId), и этот объект передается методу getById.

Это синтаксически эквивалентно следующей функции:

resolve: (_, args) => {
  const userId = args.userId
  return new User().getById({ userId: userId })
}

Из вашего вопроса неясно, какой ORM вы используете, поэтому я не могу сказать, правильно ли вы вызываете метод where в другом распознавателе. Однако вы определенно не распаковываете ни одного аргумента для этого поля. Вот ваша функция:

resolve: (_, {fields}) => new User().where({fields})

Что эквивалентно:

resolve: (_, args) => {
  const fields = args.fields
  return new User().where({ fields: fields })
}

Ваше поле имеет следующие четыре аргумента: userName, userIsLocked, userIsConfirmed и userAwaitingPassword. fields не является допустимым аргументом и поэтому всегда будет неопределенным, если вы не добавите аргумент с именем fields в ваше поле UserList и фактически не передадите его. Я собираюсь рискнуть предположить и сказать, что ваша модель также не имеет fields свойство. Если вы просто хотите передать объект arguments в метод where, вы можете сделать:

resolve: (_, fields) => new User().where(fields)

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

...