プログラム関係の備忘録。技術系記事1000記事以上を目指すブログ

【node.js】サーバー側でのバリデーションチェックに便利なvalidatorjsの使い方

  • 2020年2月11日
  • 2020年2月11日
  • JavaScript
  • 27view
  • 0件

はじめに

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 param = {
  hoge: req.body.hoge,
  fuga: req.body.fuga,
}
let rules = {hoge: 'required',fuga:'required|max:4'}

let validator = validatorCheck(param,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);
  }
},

だいぶ使いやすくなりました