Я начну с того, что говорю, я боролся дольше, чем моя гордость хочет признать, и отложил вопрос, потому что я не уверен, насколько ясным я буду; но здесь идет. , ,
Я использую Angular 9 с Apollo- Angular и у меня нет проблем с доступом к запросам GraphQL без переменных или только с одним. Если я добавлю более одного, я абсолютно неудачен. Я создал простой сервис, который позволит мне создавать динамические c запросы, поэтому у меня есть тип для переменных, который выглядит следующим образом:
Apollo- Angular клиент смотрит на это как тип, показанный на следующем изображении. Из всего, что я вижу в документации, Apollo- Angular должен быть в состоянии взять любой заданный объект и преобразовать его должным образом для выполнения запроса, но опять же ... Мне еще предстоит сделать это правильно с более чем одной переменной.
При вызове запроса это выглядит следующим образом:
Что приводит к следующий вывод в консоли отладки:
GraphQLQueryVariables {first: 5, order_by: "accountNumber.ASC"}
{"first":5,"order_by":"accountNumber.ASC"}
Error Message Notification: Error: GraphQL error: Variable `$order_by` got invalid value.
С Chrome, это то, что выполняется:
Если я копирую точно то же самое, как показано в Chrome на игровую площадку GraphQL возвращается «Переменная не может быть проанализирована. Пожалуйста go в редакторе переменных и исправьте синтаксические проблемы ”
Я часами пытался отправлять различные пути через свойство переменных WatchQuery. Если я попытаюсь отправить несколько переменных в виде строки, используя JSON .stringify, это будет выглядеть следующим образом: Chrome:
Если я в буквальном смысле сдаю вручную значение stati c, то с самого начала я получаю ту же проблему: «Переменные не могут быть проанализированы…»
Если я запускаю ту же самую вещь на игровой площадке… но просто добавляю кавычки (которые не отображаются в Chrome), я успешен:
Из того, что я вижу, независимо от того, как я отправляю его из свойства переменной Appllo- Angular Query Watch, я не могу заставить его правильно отправлять. ЕДИНСТВЕННОЕ время, которое он отправляет правильно, это если я использую только ОДНУ переменную, и эта переменная оказывается целым числом.
Есть ли альтернативный подход, который я мог бы / должен использовать? Я просто делаю это абсолютно неправильно ??
Мои конкретные вопросы c используют Angular & Apollo- Angular:
- Как отправить несколько переменных для запроса GraphQL (сначала, order_by, где, и др c)?
- Как отправить несколько элементов в пределах одной из этих переменных (например, "order_by": "customerName.AS C, accountNumber.DES C, startDate.DES C")?
РЕДАКТИРОВАТЬ: Я только что нашел это в GraphQL Specs , который говорит:
Variables Are Input Types
Formal Specification
For every operation in a document
For every variable on each operation
Let variableType be the type of variable
IsInputType(variableType) must be true
Variables can only be input types. Objects, unions, and interfaces cannot be used as inputs
Я думаю, это означает, что мне нужно добавить InputType во внутреннем интерфейсе (. net core, EF.core & Hot Chocolate), который будет генерировать тип ввода в схеме. Я еще не понял, но, по крайней мере, дал новый путь к риску.
РЕДАКТИРОВАТЬ: Каждый из моих типов имеет один из них, используемый для переменных (единственное, что изменится, это то, что в скобках «Получить [AVOs] переменные», «[AVO] Sort», «[AVO] Filter»
export interface GetAVOsVariables {
order_by?: AVOSort | null;
first?: any | null;
last?: any | null;
after?: string | null;
before?: string | null;
where?: AVOFilter | null;
}
«[x] Sort» - это строка, которая представляет собой: [fieldName]. AS C или [fieldName] .DES C независимо от типа. Фильтр работает аналогично. Я хочу получить наиболее универсальную c, повторно используемую версию, созданную для предотвращения клонирования тех же структур кода, просто для изменения типа name.
EDIT: я смог заставить переменные работать должным образом, написав это таким образом, вместо того, чтобы просто пытаться отправить объект в одну строку:
this.result = this.apollo.watchQuery<GraphQLResponse>({
query: gql`${this.query}`,
variables: {
first: this.graphRequest.variables.first,
last: this.graphRequest.variables.last,
before: this.graphRequest.variables.before,
after: this.graphRequest.variables.after,
where: this.graphRequest.variables.where,
order_by: this.graphRequest.variables.order_by
}
}).valueChanges
.pipe(map(({data}) => data));
return this.result;
}