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>