web-dev-qa-db-ja.com

GraphQLおよびフォーム検証エラー

APIサーバーにデータを投稿するフォームがあるとします。 APIサーバーは入力を検証し、JSONオブジェクトを返します。入力が無効な場合、以下のようなエラーオブジェクトが返されます。

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

GraphQLを使用する場合、これらの種類のエラーをどのように処理して処理しますか?データ検証をどのように、どこに実装する必要がありますか(それはGraphQLの一部であるか、それとも各解決関数内にある必要がありますか)?

24
xpepermint

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.' }
    ]
  }
}
19

より良い方法でGraphQLの検証を処理するために npm module を作成しました。 validate-graphql npmパッケージを確認してください。

0
Lone wolf

このパッケージをチェックしてください。これにより、graphql応答のエラー配列を介して機械可読エラーを簡単に送信できます。次に、エラーをフロントエンドにフィードしてアクションを実行したり、発生したことをユーザーに警告したりできます。

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

0
Andrew Rhyne

私は小さなパッケージ- 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' },
]

お役に立てれば幸いです。

0
Thai Ha