はじめまして、PMをやっているtatsukenと申します。はじめまして
研修の一環でvue.js、expressを書くことがあったので、そのことを中心にまとめていきたいと思います。
はじめに
Expressでmysql2やsequelizeなどを使ってデータベースを操作する事が多いと思うのですが、データベースを操作する前にはExpressで受け取ったパラメーターはバリデーションをかける必要があります。
フロントでのバリデーションはユーザー体験を向上させるためのもので、これだけではセキュリティが担保できているとは言えません。そのためサーバーサイドにもバリデーションを掛ける必要があります。
Expressのバリデーションといえばexpress-validatorなどが有名ですが今回はvalidatorjsというライブラリを使ってバリデーションをかけていきたいと思います。
実装
インストール
npm install validatorjs -s
バリデーション。
バリデーションをかけたいファイルに以下のように記述してみてください
const express = require('express');
const router = express.Router();
const validator = require('validatorjs');
router.post('/image', (req, res) => {
const data = req.body
const name = data.name // => 中身は'johndoe'
const height = data.height // => 中身は 175
const email = data.email //=> 中身は'johndoe@gmail.com',
const people = {
name: name, // => 中身は'johndoe'
height: height, // => 中身は 175
email: email //=> 中身は'johndoe@gmail.com',
}
let rules = {
name: 'required|string',//nullはNGかつsting型
heigh: 'required | integer | max: 1000',//nullはNGかつinteger型かつmaxの値は1000
email: 'required|email',//nullはNGかつemailの条件にmatchする
};
let validation = new validator(people, rules);//ここでバリデーションを判定している
if (validation.fails()) {
res.json({
status: "error",
error: validation.errors.all()//ここで詳しいエラー情報が入っている
})
return
}
})
説明
- バリデーションをかける対象(今回なら
const people
)とバリデーションのrule(今回ならconst rules
)をそれぞれobjectで作り、new validator(people, rules)
で比較していく - バリデーションルールに関しては
required | integer | max: 1000
というように自分のかけたいバリデーションルールを列挙することでルールを増やすことができる。 - ルールのすべてを見たい方はこちらをご参照ください。
- もしバリデーションが通れば
validation.fails()
はfalseとなり、バリデーションが通らなければvalidation.fails()`はtrueとなる - もしエラーの場合は
validation.errors.all()
にすべてのエラー情報が入っている。
補足
どの部分がエラーになっているかという情報は必要ない!ただバリデーションが通るかどうか知りたいという方はもっと簡単に実装出来ます。
let data = {
name: 'John',
email: 'johndoe@gmail.com',
age: 28
};
let rules = {
name: 'required',
email: 'required|email',
age: 'min:18'
};
let validation = new Validator(data, rules);
validation.passes(); // true
validation.fails(); //false
最後に
このようにvalidatorjsを使えば直感的にバリデーションをかけることが出来ます。
node.jsでバリデーションをかける際はぜひ一度使ってみてください。
なにか間違いなどありましたら、指摘いただけると幸いです。