Объект ввода Graphql из объекта angular

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

return this.apollo.mutate({
        mutation: gql`
          mutation saveLicense(license:License) {
            saveLicense(license:$license) {
              licenseId,
              name,
              body,
              deprecated,
              fsfLibre,
              osiApproved,
              spdxId,
              orLaterLicense,
              familyName,
              familyNameRegex,
              cleanName,
              twoNameRegex,
              nameAttributeList {
                attribute,
                index
              },
              attributes {
                attributeType,
                key
              }
            }
          }
        `,
         variables {license:license}
     });

В конечном итоге запрос, отправленный на сервер, должен выглядеть так (со значениями, конечно):

return this.apollo.mutate({
        mutation: gql`
          mutation {
            saveLicense(
               license:{
                   licenseId:"",
                                  name:"",
                                  licenseFamily:"",
                                  version:"",
                                  replacementLicenseId:"",
                                  spdxId:"",
                                  deprecated: false,
                                  fsfLibre:false,
                                  osiApproved:false,
                                  orLaterLicense:false,
                                  familyName:"",
                                  familyNameRegex:"",
                                  cleanName:"",
                                  twoNameRegex:"",
                                  body:"",
                                  description:""
                }
              ){
              licenseId,
              name,
              body,
              deprecated,
              fsfLibre,
              osiApproved,
              spdxId,
              orLaterLicense,
              familyName,
              familyNameRegex,
              cleanName,
              twoNameRegex,
              nameAttributeList {
                attribute,
                index
              },
              attributes {
                attributeType,
                key
              }
            }
          }
        `,
     });

Приведенный выше запрос работает, однако я НЕ МОГУ понять, как преобразовать объект angular в форму строки graphql, которая мне нужна для запроса. После ЧАСОВ исследований единственное решение, которое у меня есть, - преобразовать объект в представление json, затем снова и передать лицензию в виде строки. Это явно серьезный взлом!

JSON.parse(JSON.stringify(mylicense))

Я ищу либо пример использования переменных с angular/Apollo, либо более чистый способ преобразования угловых объектов в строки, которые я могу использовать в Graphql.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
1 395
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Сначала мы определяем переменную, указав имя и тип. Обратите внимание, что переменные всегда начинаются с $:

mutation saveLicense($license: LicenseInput) {

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

saveLicense(license: $license) {

И, наконец, передайте соответствующий объект JavaScript в качестве переменной функции mutate:

const variables = {
  license: {
    licenseId: 123,
    // and so on
  }
}
this.apollo.mutate({ mutation, variables })

Привет Даниэль. Пожалуйста, посмотрите мою обновленную верхнюю мутацию, которая правильно отражает то, как я пытаюсь использовать переменные. Это дает мне следующую ошибку: Ошибка: ошибка GraphQL: ошибка проверки типа NonInputTypeOnVariable: неправильный тип для переменной Ошибка GraphQL: ошибка проверки типа VariableTypeMismatch: тип переменной «Лицензия» не соответствует ожидаемому типу «LicenseInput» @ «saveLicense»

cyberthreat 18.06.2019 06:02

@John Итак, тип вашей переменной должен быть LicenseInput, а не License. Вам нужно будет ознакомиться со схемой службы, чтобы определить, какие поля занимает LicenseInput. Если в одном из полей есть несоответствие, вы получите сообщение об ошибке.

Daniel Rearden 18.06.2019 06:05

Интересно. Я использую Leangen/graphql-spqr для реализации моего сервера graphql, а тип сервера — Лицензия. Я предполагаю, что за кулисами он автоматически создает LicenseInput из моего запрошенного типа лицензии.

cyberthreat 18.06.2019 06:09

Это сработало! Я только что создал копию своего класса License в angular и назвал его LicenseInput, затем использовал тип LicenseInput в моем graphql, и это сработало! Я думаю, мне следует обратить больше внимания на то, что говорят ошибки. Спасибо за помощь. Мне всегда не хватает чего-то простого.

cyberthreat 18.06.2019 06:12

@Джон, я не знаком с этой библиотекой. Если сервер предоставляет интерфейс GraphiQL, я бы предложил использовать его для построения ваших запросов. GraphiQL обеспечивает подсветку синтаксиса на основе схемы.

Daniel Rearden 18.06.2019 06:12

Вот документация, как использовать переменные в graphql.

Вы должны изменить свой код следующим образом.

return this.apollo.mutate({
  mutation: gql`
    mutation saveLicense($license: License) {
      saveLicense( license: $license ) {
        licenseId,
        name,
        body,
        deprecated,
        fsfLibre,
        osiApproved,
        spdxId,
        orLaterLicense,
        familyName,
        familyNameRegex,
        cleanName,
        twoNameRegex,
        nameAttributeList {
          attribute,
          index
        },
        attributes {
          attributeType,
          key
        }
      }
    }
  `,
    variables {license: license}
});

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