LoginSignup
45
45

More than 5 years have passed since last update.

Node.js+Express4でMongoDBを使う&バリデーションする

Posted at

Express4で、MongoDBを使いつつ、バリデーションしてみます。mongoちゃんは、非常に楽でいいですね。小規模サービスなら、色んな事気にしなくていいし。MySQLをnode.jsで使おうとすると重いし、面動だして良い事ないですね。

使用モジュール

  • mongoose
  • mongoose-unique-validator
  • ect(レンダリングエンジン / jadeでもejsでもok)

モデルファイルの作成

適当にユーザ登録するフォームを作ったとして、名前とメールアドレスを保存するとします。メールアドレスはユニークがいいので、mongoose-unique-validatorというモジュールを別途インストールしておきます。

required: true or エラーメッセージといったフォーマットで必須かどうかを設定できます。

model.js
var mongoose = require('mongoose');
var uniqueValidator = require('mongoose-unique-validator');
mongoose.connect('mongodb://localhost/hoge');

var userSchema = mongoose.Schema({
  name: { type: String, required: 'ニックネームを入力してください'},
  email : { type: String, required: 'メールアドレスを入力してください', unique: true }
});
userSchema.plugin(uniqueValidator, { message: 'すでに登録されているメールアドレスです' });
var User = mongoose.model('User', userSchema);

exports.User = User;

コントローラー作成

  • /register : 登録フォーム
  • /register/confirm : 入力内容チェック&保存
  • /register/complete : 登録完了ページ
register.js
var model = require('../model.js');
var User  = model.User;

router.get('/', function(req, res) {
  res.render('register/index', {
    title: 'ユーザ登録',
    nickname: "",
    email: "",
    errors: {}
  });
});

// POSTでフォームから飛んできたデータをモデルに保存、失敗したらフォームに戻す
router.post('/confirm', function(req, res) {

  var newUser = new User(req.body);
  newUser.save(function(err){
    if (err) {
      res.render('register/index', {
        title: 'ユーザ登録エラー',
        errors: err.errors
      });
    } else {
      req.session.name = req.body.name;
      req.session.email = req.body.email;
      res.redirect('/register/complete');
    }
  })
});

router.get('/complete', function(req, res) {
  res.render('register/complete', {
    title: 'ユーザ登録完了'
  });
});

ビュー作成

エラーがあれば、エラーメッセージを表示します。

views/register/index.ect
<% extend 'layout' %>
<form action="/register/confirm" method="post">
    <dl>
        <dt>ニックネーム</dt>
        <dd>
            <input type="text" name="name" value="<%= @name %>" placeholder="ニックネーム" class="input full"/>
            <% if @errors.name : %>
            <div class="error-msg"><%- @errors.name.message %></div>
            <% end %>
        </dd>
        <dt>メールアドレス</dt>
        <dd>
            <input type="email" name="email" value="<%= @email %>" placeholder="info@example.com" class="input full"/>
            <% if @errors.email : %>
            <div class="error-msg"><%- @errors.email.message %></div>
            <% end %>
        </dd>
    </dl>
    <input type="submit" value="登録">
</form>
45
45
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
45
45