Size: a a a

GraphQL — русскоговорящее сообщество

2020 October 01

K

Konstantin in GraphQL — русскоговорящее сообщество
Алексей Родионов
А что в качестве сервера используется? Apollo Server?
Да, именно он.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Если мне не изменяет память, { AuthenticationError } from 'apollo-server-errors' должен заполнять path корректно.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Konstantin
Насколько я понимаю, path в теле ошибки генерируется автоматический в зависимости от того, в каком из резолверов была сгенерирована ошибка. А можно ли сделать такое же поведение, но для валидации входных параметров? Сейчас приходится при валидации формы в мутации заполнять path ошибок вручную.
А, неправильно прочитал вопрос.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Konstantin
Насколько я понимаю, path в теле ошибки генерируется автоматический в зависимости от того, в каком из резолверов была сгенерирована ошибка. А можно ли сделать такое же поведение, но для валидации входных параметров? Сейчас приходится при валидации формы в мутации заполнять path ошибок вручную.
А чем валидируете?
источник

K

Konstantin in GraphQL — русскоговорящее сообщество
Алексей Родионов
А чем валидируете?
Руками. Потому что все валидаторы, которые я знаю (по типу Joi) не позволяют писать свои валидаторы. Например, когда нужно сходить еще в базу для валидации и т.д. Поэтому я и искал библиотеку для валидации, которая бы сочетала в себе возможности проверки допустимости значений и написанием своих правил. Чтобы можно было написать validator().addRuleForProp('foo', () => new Error()).compile() и на выходе получить сразу список ошибок с полями, в которых произошли ошибки.
источник

K

Konstantin in GraphQL — русскоговорящее сообщество
Хотя реализация "резолверов" для полей Input типов решила бы такую проблему, но в ApolloServer нет такого функционала (насколько я знаю)
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
А кидаете, кстати, UserInputError или ValidationError?
источник

K

Konstantin in GraphQL — русскоговорящее сообщество
Кидаем ApolloError с полем списка ошибок, из-за того, что работа резолвера прервется при первой выбрашенной ошибке, а нужно вернуть не первую найденную ошибку, а сразу все.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Konstantin
Хотя реализация "резолверов" для полей Input типов решила бы такую проблему, но в ApolloServer нет такого функционала (насколько я знаю)
У инпутов нет резолверов. И это не проблема Apollo. В graphql-js их тоже нет. Спецификация GraphQL не описывает резолверы для инпутов. Потому что инпуты не существуют сами по себе в вакууме. Они юзаются в качестве аргументов в операциях (мутациях и квери). Один и тот же инпут может использоваться в двух и более операциях. И в одной операции могут быть одни правила валидации для этого инпута, а в другой другие.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Konstantin
Кидаем ApolloError с полем списка ошибок, из-за того, что работа резолвера прервется при первой выбрашенной ошибке, а нужно вернуть не первую найденную ошибку, а сразу все.
Это полезно для оптимизации. Если и так уже ошибка, дальше можно не проверять. Но тут всё у вас в руках. Вы же можете ловить ошибки.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Попробуйте Yup.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
У GraphQL Shield есть хорошая интеграция с Yup:

https://github.com/maticzav/graphql-shield
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Можно делать return ошибки вместо throw.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
Обратите внимание на abortEarly: false в Yup.
источник

АР

Алексей Родионов... in GraphQL — русскоговорящее сообщество
А ещё на chain и race для правил в Shield.
источник

K

Konstantin in GraphQL — русскоговорящее сообщество
Алексей Родионов
А ещё на chain и race для правил в Shield.
Спасибо! graphql-shield используем, а вот про Yup и связку с ним не слышал.
источник