名前フィールド、電子メールフィールド、テキストエリアで構成される3つのフィールドフォームがあります。私はhapijsとともにJoi 4.7.0バージョンを使用しています。以下のオブジェクトを使用して入力を検証します。 ajax呼び出しからデータオブジェクトを受け取ります。 3つのフィールドすべてに間違った情報を入力すると、最初の間違ったフィールドに関連するメッセージのみが表示されます。そのように:
"{"statusCode":400,"error":"Bad Request","message":"name is not allowed to be empty","validation": {"source":"payload","keys":["data.name"]}}"
validate: {
payload: {
data: {
name: Joi.string().min(3).max(20).required(),
email: Joi.string().email().required(),
message: Joi.string().min(3).max(1000).required()
}
}
}
説明のために、3つのフィールドを入力しないと仮定します。他のフィールドのメッセージエラーではなく、メッセージエラーが1つだけ表示されます。どうして?
これは、Joiがデフォルトで早期に中止されるために発生します。
abortEarly
-true
の場合、最初のエラーで検証を停止します。それ以外の場合は、見つかったすべてのエラーを返します。デフォルトはtrue
です。
* EDIT:構成はhapi 8.0で変更されました。追加する必要がありますabortEarly: false
をroutes
構成に:
var server = new Hapi.Server();
server.connection({
Host: 'localhost',
port: 8000,
routes: {
validate: {
options: {
abortEarly: false
}
}
}
});
*詳細は Joi APIのドキュメント を参照してください。
*また、 Hapi Routeオプション の下のvalidation
を参照してください。
したがって、Joiは最初のエラーで検証を停止します。
var Hapi = require('hapi');
var Joi = require('joi');
var server = new Hapi.Server('localhost', 8000);
server.route({
method: 'GET',
path: '/{first}/{second}',
config: {
validate: {
params: {
first: Joi.string().max(5),
second: Joi.string().max(5)
}
}
},
handler: function (request, reply) {
reply('example');
}
});
server.start();
server.inject('/invalid/invalid', function (res) {
console.log(res.result);
});
出力:
{ statusCode: 400,
error: 'Bad Request',
message: 'first length must be less than or equal to 5 characters long',
validation: { source: 'params', keys: [ 'first' ] } }
ただし、すべてのエラーを返すようにHapiを構成できます。このためには、abortEarly
をfalse
に設定する必要があります。これはサーバー構成で行うことができます。
var server = new Hapi.Server('localhost', 8000, { validation: { abortEarly: false } });
今すぐスクリプトを実行すると、次のようになります。
{ statusCode: 400,
error: 'Bad Request',
message: 'first length must be less than or equal to 5 characters long. second length must be less than or equal to 5 characters long',
validation: { source: 'params', keys: [ 'first', 'second' ] } }
私はhapi.jsと統合していませんが、渡すことができるValidationOptions
オブジェクトがあることに気付きました。そのオブジェクトの内部にはabortEarly
オプションがあるため、これは機能するはずです。
Joi.validate(request, schema, { abortEarly: false }
これは次のように構成することもできます。
Joi.object().options({ abortEarly: false }).keys({...});
その他のValidationOptions
については、これらの型定義を確認してください。 https://github.com/DefinitelyTyped/tsd/blob/master/typings/joi/joi.d.ts
validation
キーは、Hapi 8.0のHapi.Server
コンストラクターでは機能しなくなりました。
[1]検証は許可されていません
私は hapiのGitHubの問題 で解決策を見つけました:
var Hapi = require('hapi');
var server = new Hapi.Server();
server.connection({
Host: Host,
port: PORT,
routes: {
validate: {
options: {
abortEarly: false
}
}
}
});
// Route using Joi goes here.
server.route({});
server.start(function () {
console.log('Listening on %s', server.info.uri);
});