Подтвердить что ты не робот

Ошибки проверки GraphQL и формы

Скажем, у вас есть форма, которая отправляет данные на сервер API. Сервер API проверяет ввод и возвращает объект JSON. Если вход недействителен, возвращаются объекты ошибок, подобные приведенным ниже.

{errors: {field1: "is required"}}

Как мы обрабатываем и обслуживаем такие ошибки при использовании GraphQL? Как и где должна выполняться проверка данных (должна ли она быть частью GraphQL или должна быть внутри каждой функции разрешения)?

4b9b3361

Ответ 1

С логикой проверки внутри метода resolve у вас есть полный контроль над сгенерированными ошибками пользователя. Вот пример:

// data/mutations/createUser.js
import {
  GraphQLObjectType as ObjectType,
  GraphQLNonNull as NonNull,
  GraphQLList as List,
  GraphQLString as StringType
} from 'graphql';
import validator from 'validator';
import UserType from '../types/UserType';

export default {
  type: new ObjectType({
    name: 'CreateUserResult',
    fields: {
      user: { type: UserType },
      errors: { type: new NonNull(new List(StringType)) }
    }
  }),
  args: {
    email: { type: new NonNull(StringType) },
    password: { type: new NonNull(StringType) }
  },
  resolve(_, { email, password }) {
    let user = null;
    let errors = [];

    if (validator.isNull(email)) {
      errors.push(...['email', 'The email filed must not be empty.']);
    } else if (!validator.isLength(email, { max: 100})) {
      errors.push(...['email', 'The email must be at a max 100 characters long.']);
    }

    // etc.

    return { user, errors };
  }
};

Смотрите мой пост в блоге на эту тему - Проверка и ошибки пользователя в мутациях GraphQL

В качестве альтернативы создайте type UserErrorType { key: String!, message: String! }, который можно использовать вместо простых строк при компиляции списка пользовательских ошибок, которые будут возвращены вызывающему.

Запрос GraphQL

mutation {
  createUser(email: "[email protected]", password: "Passw0rd") {
    user { id, email },
    errors { key, message }
  }
}

Ответ на запрос

{
  data: {
    user: null,
    errors: [
      { key: '', message: 'Failed to create a new user account.' },
      { key: 'email', message: 'User with this email already exists.' }
    ]
  }
}

Ответ 2

Проверьте этот пакет. Это позволяет легко отправлять машиночитаемые ошибки через массив ошибок в ответе graphql. Затем вы можете передать ошибки в свой интерфейс и принять меры и/или предупредить пользователя о том, что произошло:

https://github.com/thebigredgeek/apollo-errors

Ответ 3

Я использую небольшой пакет - graphql-validation для проверки формы в моем проекте. Оборачивает validator.js. Так легко в использовании.

Пример:

const { validator, validate } = require('graphql-validation'); // Import module

const resolver = {
  Mutation: {
    createPost: validator([ // <-- Validate here
      validate('title').not().isEmpty({ msg: 'Title is required' }),
      validate('content').isLength({ min: 10, max: 20 }),
    ], (parent, args, context, info) => {
      if (context.validateErrors.length > 0) {
        // Validate failed
        console.log(context.validateErrors); // Do anything with this errors

        return;
      }

      // Validate successfully, time to create new post
    }),
  },
};
Input: { title: '', content: 'Hi!' }

// console.log(context.validateErrors);
Output: [
  { param: 'title', msg: 'Title is required' },
  { param: 'content', msg: 'Invalid value' },
]

Надеюсь, что это полезно.

Ответ 4

Я создал модуль npm для лучшей обработки проверок в GraphQL. Пожалуйста, проверьте пакет validate-graphql npm.