きっかけ
Top 5 Validation Libraries for JavaScript in 2024 - DEV Community
上記サイトを見て、気になったから。
あと、日本語発音の"ジョイ"で俺が知ってる"ジョイ"といえば、地球圏最強の洗剤"JOY"。
きっと、validator界でも最強のはずという妄想もある。
試そうと思った理由の8割は、JOY
日常生活+ガンプラ作成で使ってるから。
残り2割は、フロントのバリデーション系に触ってみたかったから
公式サイト
自分が使ったバージョンのAPIドキュメントへのリンク
joi.dev - 17.13.3 API Reference
実装
見せてもらおうか、joiのvalidator機能の性能とやらを
環境準備
適当にフォルダを掘ってnpmプロジェクトを作って、joiをインストールする。
$ npm init -y $ npm i joi
本実装
初めて触るのなら、やっぱり、公式サイトのサンプルを動かすのが一番手っ取り早い。
自分は、index.jsを作ってそこにコピペ。
検証している箇所が微妙に間違えているので、そこだけ手直し。
const Joi = require('joi');
const schema = Joi.object({
username: Joi.string()
.alphanum()
.min(3)
.max(30)
.required(),
password: Joi.string()
.pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')),
repeat_password: Joi.ref('password'),
access_token: [
Joi.string(),
Joi.number()
],
birth_year: Joi.number()
.integer()
.min(1900)
.max(2013),
email: Joi.string()
.email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })
})
.with('username', 'birth_year')
.xor('password', 'access_token')
.with('password', 'repeat_password');
console.log("== 正常系 ==")
var result1 = schema.validate({ username: 'abc', birth_year: 1994, password: "123", repeat_password: "123"});
// -> { value: { username: 'abc', birth_year: 1994, password: '123', repeat_password: '123' } }
console.log(result1)
console.log("== 異常系 ==")
var result2 = schema.validate({ username: 'abc', birth_year: 1994 });
// -> { value: { username: 'abc', birth_year: 1994 } }
console.log(result2);
var result3 = schema.validate({});
// -> { value: {}, error: '"username" is required' }
console.log(result3)
console.log("== Async ==")
try {
(async function () {
const value = await schema.validateAsync({ username: 'abc', birth_year: 1994, password: "123", repeat_password: "123"});
console.log(value);
}());
}
catch (err) { }
やっていること
- ユーザー名
- 必須文字列
- 英数字のみ
- 3文字以上30文字以内
- birth_yearも設定する( .with('username', 'birth_year')が該当)
- パスワード
- access_token
- 制約のない任意の文字列または数値
- 誕生年
- 1900年から2013年までの整数
- メールアドレス
実行結果
自分の端末では、下記のように出てきた。
$ node index.js
== 正常系 ==
{
value: {
username: 'abc',
birth_year: 1994,
password: '123',
repeat_password: '123'
}
}
== 異常系 ==
{
value: { username: 'abc', birth_year: 1994 },
error: [Error [ValidationError]: "value" must contain at least one of [password, access_token]] {
_original: { username: 'abc', birth_year: 1994 },
details: [ [Object] ]
}
}
{
value: {},
error: [Error [ValidationError]: "username" is required] {
_original: {},
details: [ [Object] ]
}
}
== Async ==
{
username: 'abc',
birth_year: 1994,
password: '123',
repeat_password: '123'
}
感想
最近の潮流として、validatorは、チェーンつなぐ感じのやつが多い印象。
joiもその流行に乗って作られている。
理解は、比較的しやすかった。
個人的には、withやxorなんかで複合条件が書きやすいところがメリットのように感じた。
あと、JavaScriptといえば非同期実装みたいなところがあるので、非同期の入力チェックが新鮮だった。
xorって言って通じない人がいるような気がしないでもないが、基礎を抑えてる人なら、すぐに理解できるはず。
今回はJavaScriptで試したけど、TypeScriptならもっと有効活用できるのではないかと感じた。