11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Expressのvalidationについて

Posted at

やること

ブロックチェーン以外のネタもたまには書いてみたいですというエントリー

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を読み込むようにしてあります。

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はこんな感じ

testValidator.js
const { check, validationResult } = require('express-validator/check')

module.exports = [
  check('email').isEmail().withMessage('must be a valid email')
];

うすい!

あとがき

Expressはmiddlewearの積み重ねで作り上げて行くものなんだなあと思いました。

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?