web-dev-qa-db-ja.com

Joi検証でエラーメッセージが1つだけ返される

名前フィールド、電子メールフィールド、テキストエリアで構成される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つだけ表示されます。どうして?

26
Mazzy

これは、Joiがデフォルトで早期に中止されるために発生します。

abortEarly-trueの場合、最初のエラーで検証を停止します。それ以外の場合は、見つかったすべてのエラーを返します。デフォルトはtrueです。

* EDIT:構成はhapi 8.0で変更されました。追加する必要がありますabortEarly: falseroutes構成に:

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を構成できます。このためには、abortEarlyfalseに設定する必要があります。これはサーバー構成で行うことができます。

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' ] } }
28
Gergo Erdosi

私は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

13
Stephen Paul

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);
});
4
chris van