GraphQL和表单验证错误

xpe*_*int 23 validation error-handling graphql

假设您有一个将数据发布到API服务器的表单.API服务器验证输入并返回JSON对象.如果输入无效,则返回如下所示的错误对象.

{errors: {field1: "is required"}}
Run Code Online (Sandbox Code Playgroud)

使用GraphQL时,我们如何处理和提供这些错误?应该如何以及在何处实施数据验证(应该是GraphQL的一部分还是应该在每个解析函数中)?

Kon*_*kus 18

使用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 };
  }
};
Run Code Online (Sandbox Code Playgroud)

请参阅我关于此主题的博客文章 - GraphQL Mutations中的验证和用户错误

或者,type UserErrorType { key: String!, message: String! }在编译要返回给调用者的用户错误列表时,可以使用create 而不是plain字符串.

GraphQL查询

mutation {
  createUser(email: "hello@tarkus.me", password: "Passw0rd") {
    user { id, email },
    errors { key, message }
  }
}
Run Code Online (Sandbox Code Playgroud)

查询响应

{
  data: {
    user: null,
    errors: [
      { key: '', message: 'Failed to create a new user account.' },
      { key: 'email', message: 'User with this email already exists.' }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这可能是我们将要获得的最佳临时解决方案,除非GraphQL选择单独的错误对象来区分系统错误和用户字段/消息验证.我所做的唯一一个微小的改变是创建一个具有`field`和`msg`键的专用`ErrorType`,因此它比使用数组插入顺序更容易使用...但它最终是相同的事情. (4认同)