APIサーバーにデータを投稿するフォームがあるとします。 APIサーバーは入力を検証し、JSONオブジェクトを返します。入力が無効な場合、以下のようなエラーオブジェクトが返されます。
{errors: {field1: "is required"}}
GraphQLを使用する場合、これらの種類のエラーをどのように処理して処理しますか?データ検証をどのように、どこに実装する必要がありますか(それはGraphQLの一部であるか、それとも各解決関数内にある必要がありますか)?
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! }
呼び出し元に返されるユーザーエラーのリストをコンパイルするときに、プレーンな文字列の代わりに使用できます。
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.' }
]
}
}
より良い方法でGraphQLの検証を処理するために npm module を作成しました。 validate-graphql npmパッケージを確認してください。
このパッケージをチェックしてください。これにより、graphql応答のエラー配列を介して機械可読エラーを簡単に送信できます。次に、エラーをフロントエンドにフィードしてアクションを実行したり、発生したことをユーザーに警告したりできます。
私は小さなパッケージ- 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' },
]
お役に立てれば幸いです。