mongooseには複数のcustom validatorを設定できる
小さいvalidatorを複数渡すと
わかりやすいエラーメッセージが作れる
https://gyazo.com/46016ff085cf59b9f658e5d12ef08818
なんかNameとurlで表記ブレがあるな。直そうshokai.icon
validatorとmessageのペアを1つしか渡せない、ように見える
code:user-phone.js
var userSchema = new Schema({
phone: {
type: String,
validate: {
validator: function(v) {
return /\d{3}-\d{3}-\d{4}/.test(v);
},
message: props => ${props.value} is not a valid phone number!
},
}
});
user.phoneなら「正しい電話番号ではない」だけでも良いと思う
しかし、ちょっと複雑な条件を設定したい場合がある
例:Scrapboxのproject.url
2文字以上、かつ
24文字以下
最初と最後はアルファベットか数字。記号は使えない
(以下略)
1つのvalidatorに、「2文字以上24文字以下、先頭と末尾はアルファベットか数字で〜」みたいな条件を全部入れると
エラーメッセージが凄い事になってしまう
https://gyazo.com/ee7647008b71ab3b680467698e4650bd
関係ない所で怒られが発生してしまう
24文字以上、の部分だけが問題なのに
2文字以下とか、アルファベットとか
問題ない所まで指摘されて、問題あるのかな?と考えてしまう
こう書くと良い
code:user-name.js
const projectSchema = new Schema(
url: {
type: String,
validate: [
{validator: v => v.length >= 2, message: '2文字以上必要です' },
{validator: v => v.length < 24, message: '24文字以下にしてください'},
{validator: v => /^a-z\d/i.test(v), message: '先頭はアルファベットか数字にしてください'}, {validator: v => /a-z\d$/i.test(v), message: '末尾はアルファベットか数字にしてください'} }
}
)
公式ドキュメントには書かれていないので正式な書き方ではないのかな?
と思っていたけど
1年前からこういう書き方をscrapboxでやっていて、ずっと動いている
なので、まあたぶん大丈夫だと思う
結果
自分の入力した値のどこが問題なのか?だけを表示できるようになった
https://gyazo.com/46016ff085cf59b9f658e5d12ef08818