Учебники

GraphQL — валидация

При добавлении или изменении данных важно проверить вводимые пользователем данные. Например, нам может потребоваться убедиться, что значение поля всегда не равно нулю. Мы можем использовать ! (не обнуляемый) тип маркера в GraphQL для выполнения такой проверки.

Синтаксис для использования ! тип маркера как указано ниже —

type TypeName {
   field1:String!,
   field2:String!,
   field3:Int!
}

Приведенный выше синтаксис гарантирует, что все поля не равны NULL.

Если мы хотим реализовать дополнительные правила, такие как проверка длины строки или проверка, находится ли число в заданном диапазоне, мы можем определить пользовательские валидаторы. Пользовательская логика проверки будет частью функции распознавателя. Позвольте нам понять это с помощью примера.

Иллюстрация — Реализация пользовательских валидаторов

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

Шаг 1 — Загрузите и установите необходимые зависимости для проекта

Создайте папку с именем validation-app . Измените каталог на приложение-валидацию из терминала. Выполните шаги с 3 по 5, описанные в главе «Настройка среды».

Шаг 2 — Создание схемы

Добавьте файл schema.graphql в папку validation-app проекта и добавьте следующий код —

type Query {
   greeting:String
}

type Mutation {
   signUp(input:SignUpInput):String
}

input SignUpInput {
   email:String!,
   password:String!,
   firstName:String!
}

Примечание. Мы можем использовать тип входа SignUpInput, чтобы уменьшить количество параметров в функции signUp. Итак, функция signUp принимает только один параметр типа SignUpInput.

Шаг 3 — Создание резольверов

Создайте файл resolvers.js в папке проекта и добавьте следующий код —

const Query = {
   greeting:() => "Hello"
}

const Mutation ={
   signUp🙁root,args,context,info) => {

      const {email,firstName,password} = args.input;

      const emailExpression = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
      
      const isValidEmail =  emailExpression.test(String(email).toLowerCase())
      if(!isValidEmail)
      throw new Error("email not in proper format")

      if(firstName.length > 15)
      throw new Error("firstName should be less than 15 characters")

      if(password.length < 8 )
      throw new Error("password should be minimum 8 characters")
      
      return "success";
   }
}
module.exports = {Query,Mutation}

Функция распознавателя signUp принимает параметры email, пароля и firstName. Они будут переданы через входную переменную, чтобы к ней можно было получить доступ через args.input.

Шаг 4 — Запустите приложение

Создайте файл server.js. См. Шаг 8 в главе «Настройка среды». Выполните команду npm start в терминале. Сервер будет работать на 9000 портов. Здесь мы будем использовать GraphiQL в качестве клиента для тестирования приложения.

Откройте браузер и введите URL-адрес http: // localhost: 9000 / graphiql . Введите следующий запрос в редакторе —

mutation doSignUp($input:SignUpInput) {
   signUp(input:$input)
}

Поскольку вход в функцию регистрации является сложным типом, нам нужно использовать переменные запроса в graphiql. Для этого нам нужно сначала дать имя запросу и назвать его doSignUp, $ input — это переменная запроса.

Следующая переменная запроса должна быть введена на вкладке переменных запроса в graphiql —

{
   "input":{
      "email": "abc@abc",
      "firstName": "kannan",
      "password": "pass@1234"
   }
}

Массив ошибок содержит подробную информацию об ошибках проверки, как показано ниже —

{
   "data": {
      "signUp": null
   },
   
   "errors": [
      {
         "message": "email not in proper format",
         "locations": [
            {
               "line": 2,
               "column": 4
            }
         ],
         "path": [
            "signUp"
         ]
      }
   ]
}

Мы должны ввести правильный ввод для каждого поля, как указано ниже —

{
   "input":{
      "email": "[email protected]",
      "firstName": "kannan",
      "password": "pass@1234"
   }
}

Ответ таков —

{
   "data": {
      "signUp": "success"
   }
}

Здесь, в следующем запросе, мы не назначаем пароль.

{
   "input":{
      "email": "[email protected]",
      "firstName": "kannan"
   }
}

Если обязательное поле не предоставлено, сервер qraphql отобразит следующую ошибку: