はじめに
node.jsに限らず、WEBアプリ作成をする際のバリデーションはフロント側、サーバー側共に必要になってくると思います。
フロント側はhtml5の機能だけでもそこそこできるし、bootstrapで見た目も簡単に良い感じに表示することができます。
以下では、サーバー側でもお手軽にバリデーションを実装する方法を紹介していきます。
npmのvalidatorjsを使ってバリデーションチェックを行う
npmでは他にもいくつかバリデーション関連のパッケージがありますが、今回は
validatorjsというものを使って実装します。
パッケージのインストール
npm i -save validatorjs
バリデーションを使いたいファイルで以下を読み込み
var validator = require('validatorjs');
チェック処理の実装
let param = {
username: req.body.user,
password: req.body.password,
}
let rules = {username: 'required|max:16',password:'required|max:4|min:4'}
let validation = new validator(param, rules)
if (validation.fails()) {
console.log(validation.errors.all())
}
上記では最も簡単なチェック方法の例として記載します。
リクエストボディからパラメータを受け取りObjectに格納、同じく各Objectのバリデーションルールを指定し、new validatorの引数として渡します。
バリデーションエラーがある場合は、validarion.failsに入ってくるので、validation.errors.all()で全てのエラーを吐き出します。
validatorjsを使いやすくする
上記では単にvalidatorjsの動きを確認するような例でしたが、これをもう少し実用的にした例を書いていきます。考慮点は以下
・エラーメッセージに日本語を使いたい
・エラーメッセージは一件だけ表示したい
・汎用的に使いやすくする
エラーメッセージに日本語を使いたい
validatorjsはデフォルトで英語のエラーメッセージを表示するので、これを日本語に変更する方法です。
ドキュメントにもありますが、npmでインストールした場合にはすでにnode.modules内のvalidatorjs/dist/lang以下に各言語のメッセージテンプレートが格納されています。
そのため、requireした後で以下のように指定してあげるだけで、日本語でのエラーメッセージ出力が可能になります。
var validator = require('validatorjs');
validator.useLang('ja.js');
エラーメッセージは一件だけ表示したい
初めの例で記載したvalidation.errors.all()では、すべてのエラー内容がObjectに格納され、さらに複数エラーがある場合には配列で格納されて返却されます。
エラー内容がドバーっとでるよりは、はじかれた時点でその内容を出力したかったので、以下のようにしました。
let param = {
username: req.body.user,
password: req.body.password,
}
let rules = {username: 'required|max:16',password:'required|max:4|min:4'}
let validation = new validator(param, rules)
if (validation.fails()) {
Object.keys(param).forEach(function (key) {
if(validation.errors.first(key)){
let message = validation.errors.first(key)
return message;
}
});
バリデーションエラーが起きた際はvalidation.fails()がtrueになるので、その場合Objectを一つずつエラー確認し、最初にエラーになったObjectのメッセージ内容を返しています。
汎用的に使いやすくする
上記で書いていたようにいちいちnewして書いているのは面倒なので、関数化した使い方の例を記載します。
呼び出し元
let rules = {hoge: 'required',fuga:'required|max:4'}
let validator = validatorCheck(req.body,rules)
if(!validator.result) {
let message = validator.message
return res.render('/index',{message: message})
}
呼び出し先
validatorCheck: function (param,rules){
let res = {}
let validation = new validator(param, rules)
if (validation.fails()) {
Object.keys(param).forEach(function (key) {
if(validation.errors.first(key)){
res.result = false
res.message = validation.errors.first(key)
return res;
}
});
} else {
res.result = true
return(res);
}
},
だいぶ使いやすくなりました