web-dev-qa-db-ja.com

Node.js + Joiカスタムエラーメッセージの表示方法

Node.js RESTapiでのユーザー入力をJoiで検証するのは非常に簡単です。

しかし、問題は私のアプリが英語で書かれていないことです。つまり、カスタムの書面によるメッセージをフロントエンドユーザーに送信する必要があります。

私はこれをグーグルで検索しましたが、問題のみが見つかりました。

誰かがこれに対する解決策を与えることができますか?

これは、Joiシステムで検証するために使用しているコードです。

    var schema = Joi.object().keys({
      firstName: Joi.string().min(5).max(10).required(),
      lastName: Joi.string().min(5).max(10).required()
      ..
    });

    Joi.validate(req.body, schema, function(err, value) {
      if (err) {
        return catched(err.details); 
      }
    });

    function catched(reject) {
      res.json({
        validData: false,
        errors: reject
      });
    }

さらに、クライアント側でJoiを使用する方法はありますか?

ありがとう!

15
Raz

私が見つけた解決策は設定することです:

var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().label("Your error message in here"),
  lastName: Joi.string().min(5).max(10).required()
  ..
});

次に、コールバックlabel変数からerrorを出力します

16
Raz

Ashish Kadam's answer に拡張して、多くの異なるエラータイプがある場合、どのタイプのエラーが存在するかを確認し、それに応じてメッセージを設定できます。

_var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().error(errors => {
    errors.forEach(err => {
      switch (err.type) {
        case "any.empty":
          err.message = "Value should not be empty!";
          break;
        case "string.min":
          err.message = `Value should have at least ${err.context.limit} characters!`;
          break;
        case "string.max":
          err.message = `Value should have at most ${err.context.limit} characters!`;
          break;
        default:
          break;
      }
    });
    return errors;
  }),
  // ...
});
_

ここでエラーのリストを確認できます: Joi 14.3.1 APIリファレンス>エラー>エラーのリスト

また、詳細については _any.error_ リファレンスを確認してください。ドキュメントの引用:

ルールが失敗した場合、デフォルトのjoiエラーをカスタムエラーで上書きします。

  • errは次のいずれかです。
    • Errorのインスタンス-オーバーライドエラー。
    • function(errors)。エラーの配列を引数として取り、次のいずれかでなければなりません。
      • stringを返します-エラーメッセージをこのテキストに置き換えます
      • 単一のobjectまたはArrayを返します。ここで、
        • type-エラーのタイプを提供するオプションのパラメーター(_number.min_など)。
        • message-templateが提供される場合のオプションのパラメーター。エラーのテキストが含まれます。
        • template-テンプレート文字列を含むmessageが提供される場合のオプションのパラメーターで、通常のjoi言語エラーと同じ形式を使用します。
        • context-templateを使用している場合にエラーのコンテキストを提供するオプションのパラメーター。
      • Errorを返します-Errorを直接指定した場合と同じですが、エラーに基づいてエラーメッセージをカスタマイズできます。
  • options
    • self-エラーハンドラーをすべてのエラーに使用するか、このプロパティで発生したエラーのみに使用するかを示すブール値(true値)。他の値には子がないため、この概念はarrayまたはobjectスキーマに対してのみ意味があります。デフォルトはfalseです。
21

Joiバージョン14.0.

const SchemaValidation = {
  coins: Joi.number()
    .required()
    .error(() => {
      return {
        message: 'Coins is required.',
      };
    }),
  challenge_name: Joi.string()
    .required()
    .error(() => {
      return {
        message: 'Challenge name is required.',
      };
    }),
  challengeType: Joi.string()
    .required()
    .error(() => {
      return {
        message: 'Challenge type is required.',
      };
    }),
  challengeDescription: Joi.string()
    .required()
    .error(() => {
      return {
        message: 'Challenge description is required.',
      };
    }),
};

errorsオブジェクトでは、取得、エラータイプ、およびメッセージの変更を行うことができます。

18
Ashish Kadam

。error(new Error( 'message'))を使用できます。

var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().error(new Error('Give your error message here for first name')),
  lastName: Joi.string().min(5).max(10).required().error(new Error('Give your error message here for last name'))
  ..
});

Joi.validate(req.body, schema, function(err, value) {
  if (err) {
    console.log(err.message)
    return catched(err.message); 
  }
});
9
Sameer Ek

let schema = Joi.object({foo:Joi.number()。min(0)。error(()=> '"foo"には正数が必要です')});

ドキュメント リンク

3
Max Sherbakov

カスタムメッセージを追加する解決策:別の連鎖関数を追加して、スキーマの定義中にエラーをスローするだけです。
あなたの場合

 firstName: Joi.string().min(5).max(10).required().error(new Error('I am a custom error and I know it!')),

残りは同じままです。

クライアント側でJoiを使用するための解決策(2番目の質問)

Joi-Browser は、クライアント側で同じスキーマを使用できるようにするパッケージです。

こちら は興味深い議論です。

乾杯!

2
let schema = Joi.object().keys({
   Joi.string().required().options({language: {any: {required: "First name is required"}}})
});
1
yatinsmile