Я хочу использовать угловой объект в качестве входной переменной для мутации 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.





Не используйте интерполяцию строк для ввода переменных в запрос — определите свои переменные как часть определения операции, а затем используйте их вместо входного литерала.
Сначала мы определяем переменную, указав имя и тип. Обратите внимание, что переменные всегда начинаются с $:
mutation saveLicense($license: LicenseInput) {
Затем используйте переменную в качестве входных данных для аргумента, например:
saveLicense(license: $license) {
И, наконец, передайте соответствующий объект JavaScript в качестве переменной функции mutate:
const variables = {
license: {
licenseId: 123,
// and so on
}
}
this.apollo.mutate({ mutation, variables })
@John Итак, тип вашей переменной должен быть LicenseInput, а не License. Вам нужно будет ознакомиться со схемой службы, чтобы определить, какие поля занимает LicenseInput. Если в одном из полей есть несоответствие, вы получите сообщение об ошибке.
Интересно. Я использую Leangen/graphql-spqr для реализации моего сервера graphql, а тип сервера — Лицензия. Я предполагаю, что за кулисами он автоматически создает LicenseInput из моего запрошенного типа лицензии.
Это сработало! Я только что создал копию своего класса License в angular и назвал его LicenseInput, затем использовал тип LicenseInput в моем graphql, и это сработало! Я думаю, мне следует обратить больше внимания на то, что говорят ошибки. Спасибо за помощь. Мне всегда не хватает чего-то простого.
@Джон, я не знаком с этой библиотекой. Если сервер предоставляет интерфейс GraphiQL, я бы предложил использовать его для построения ваших запросов. GraphiQL обеспечивает подсветку синтаксиса на основе схемы.
Вот документация, как использовать переменные в 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}
});
Привет Даниэль. Пожалуйста, посмотрите мою обновленную верхнюю мутацию, которая правильно отражает то, как я пытаюсь использовать переменные. Это дает мне следующую ошибку: Ошибка: ошибка GraphQL: ошибка проверки типа NonInputTypeOnVariable: неправильный тип для переменной Ошибка GraphQL: ошибка проверки типа VariableTypeMismatch: тип переменной «Лицензия» не соответствует ожидаемому типу «LicenseInput» @ «saveLicense»