やること
ブロックチェーン以外のネタもたまには書いてみたいですというエントリー
Expressはフレームワークとしては設計思想に口出ししすぎないよう、デフォルト状態だと薄く作られており(って誰かが言ってた)、ベストプラクティス的なものは割と開発者の設計によって異なるのだなあという印象です。
Expressを最初に取っ付くときに色々と迷うものの一つとしてバリデーションの仕組みつくりがあげれられると思います。
ので、今回はその備忘録となります。
Expressでバリデーションってどうやるんだ・・・
調べると、だいたいexpress-validatorがよく使われているっぽい!
https://express-validator.github.io/docs/
※express-validatorそのものについてはこの記事では詳しく触れません。。。
できればLaravelのformRequestとかみたいに、Controllerに行く前に決着がつくようにしたいぞ。。。
公式のサンプル
// ...rest of the initial code omitted for simplicity.
const { check, validationResult } = require('express-validator/check');
app.post('/user', [
// username must be an email
check('username').isEmail(),
// password must be at least 5 chars long
check('password').isLength({ min: 5 })
], (req, res) => {
// Finds the validation errors in this request and wraps them in an object with handy functions
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(422).json({ errors: errors.array() });
}
User.create({
username: req.body.username,
password: req.body.password
}).then(user => res.json(user));
});
ふむふむ・・・わかりやすい・・・
が・・・・
公式ドキュメントの例としては完全ですが、
実際に組み込んでみる場合、routingに直接validationを書き込むようなことは
あんまりないはず・・・
こうしよう
※Expressのapp.jsからあらかじめroute/index.js
を読み込むようにしてあります。
//module
var express = require('express')
var router = express.Router()
//controller
var testController = require('path/to/testController')
//validator
var testValidator = require('path/to/validator/testValidator')
//routing
router.post('/test', testController, testController.store)
こんな感じで、Express的に言うと「ルーター・レベルのミドルウェア」のような感じで、controllerに処理がたどり着く前に、postされたdataに対してvalidationにかけることができました。
一応、validatorはこんな感じ
const { check, validationResult } = require('express-validator/check')
module.exports = [
check('email').isEmail().withMessage('must be a valid email')
];
うすい!
あとがき
Expressはmiddlewearの積み重ねで作り上げて行くものなんだなあと思いました。