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
を使用する方法はありますか?
ありがとう!
私が見つけた解決策は設定することです:
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
を出力します
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
です。
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オブジェクトでは、取得、エラータイプ、およびメッセージの変更を行うことができます。
。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);
}
});
let schema = Joi.object({foo:Joi.number()。min(0)。error(()=> '"foo"には正数が必要です')});
ドキュメント リンク
カスタムメッセージを追加する解決策:別の連鎖関数を追加して、スキーマの定義中にエラーをスローするだけです。
あなたの場合
firstName: Joi.string().min(5).max(10).required().error(new Error('I am a custom error and I know it!')),
残りは同じままです。
クライアント側でJoiを使用するための解決策(2番目の質問)
Joi-Browser は、クライアント側で同じスキーマを使用できるようにするパッケージです。
こちら は興味深い議論です。
乾杯!
let schema = Joi.object().keys({
Joi.string().required().options({language: {any: {required: "First name is required"}}})
});