2018年5月27日日曜日

【Node.js】入力値調整ライブラリ"adjuster"のフライング紹介

ウェブアプリケーションを作っていると、入力値の型とか値のバリデーションをしたいときありますよね。
そして、バリデーションだけじゃなくて状況に応じていい感じにデフォルト値をつけたり、上限下限に収まるように数値を調整したくなるときありますよね。

ありますよね?

そんなあなたに朗報です。

何おしえてくれるの?

node-adjuster

まだ正式リリース前ですが、この記事を見ているみなさんにこっそり教えちゃいます。

バリデータじゃダメなの?

JavaScriptのバリデータとしてはvalidate.jsが有名なんじゃないかと思いますが、こういう系統のライブラリはバリデータの名前どおり、検証するだけなんですよ。多分。

でも、検証の結果、修正できるならしたい場合ってあるじゃないですか。例えば…
  • パラメータnameの前後のスペースを取り除きたい。
  • パラメータlimitは1-50までの数値を想定。0以下/51以上はそれぞれ0/50にしたい。
  • パラメータoffsetは省略可能。省略した場合はデフォルト値として0を使いたい。
などなど。

それぞれのパラメータがどういう名前でどういう制約なのかといった情報が一目でわかるように、可読性と使いやすさを追求したのがこのnode-adjusterです。

使い方

READMEに書いてありますが、まずはnpmでインストールします。
$ npm install -S adjuster
npmのパッケージ名はnode-adjusterではなくadjusterなので注意。

使い方も簡単。
import adjuster from "adjuster";

// 入力値の制約
const constraints = {
    // 文字列/必須/前後の空白を除去/空白除去後の最大長16(超過時は16文字に切り詰める)
    name: adjuster.string().trim().maxLength(16, true),
    // Eメールアドレス/必須
    email: adjuster.email(),
    // 数値/省略可(省略時はnull)/最小値0(下回ったら0にする)
    age: adjuster.number().default(null).minValue(0, true),
};
// req.bodyの値をconstraintsの制約に従って調整したものがparamsに入る
const params = adjuster.adjust(req.body, constraints);
わかりやすいと思いませんか?わかりやすいですよね

文字列や数値やメアドの他にも、「数値の配列」「文字列の配列」「数値文字列」「IPアドレス」など、さまざまな形式に対応しています。
ちなみにメアドのチェックは、以前紹介した可能な限りRFCに準拠する方法を採用しています。

パラメータの制約はチェーンメソッドで記述するので可読性が非常に高く、デフォルト値、文字列長、値の範囲、数値文字列のチェックサム(クレジットカードやISBNなど)など様々対応しています。詳しくはREADMEをごらんください。

今までの自作ライブラリは割と適当に作って放流することもありましたが、これはガチで流行らせたいので、プロダクションレベルの品質を目指してテストコードもしっかり書いて、GitHubとCIを連携させています。
(普段からやれよってツッコミはなしの方向で)

そして、このライブラリを使った開発が楽になるように、IntelliJ IDEAの補完に対応しています。
メソッド名を調べる手間はありません。

バージョン1への道

いずれ日付とか時刻とかの形式にも対応させたいとは思っているんですが、それよりもプロダクションレベルの品質に必要なのは
  • 仕様の固定
  • セキュリティ
  • ドキュメント
この3つだと思っています。対応形式なんか正式版リリース後でもどうにでもなります。

仕様の固定

正式版を出したら、そう簡単に仕様は変えられません。
一応セマンティックバージョニングを採用しているので互換性を保ちつつバージョンアップは容易にできるようにはするつもりですが、それでも仕様はあまり変えないほうがいいですよね。

特に慎重になっているのはバリデーションエラー時の対応です。
現在は例外処理とコールバックの両方で処理できるようにしていますが、問題ないか検討中です。 もしかしたら正式版のリリース前に何度か仕様が変わるかもしれません。

セキュリティ


特にNode.jsはシングルプロセスなので、入力値の処理に時間がかかると他のリクエストもブロックしてしまいます。
そのため、どんな値が入力されても(特にどんなに大きなデータが入力されても)予測可能な時間で処理する必要があります。

具体的には、入力文字列の長さを制限してしまうような機能を(文字列だけでなく)全ての形式に導入することを検討しています。

ドキュメント

現在のREADMEには一通りのメソッドについて使い方の例を記載していますが、メソッドの機能や引数や戻り値などを解説したリファレンスはまだありません。

このあたりも、正式版リリース前に整備予定です。

0 件のコメント:

コメントを投稿