//tips
//smart contract
昨日のsyncの働きについて少し復習。
router.post('/add', (req, res, next) =>{
//syncは全てのモデルを同期して処理していくためのもの
//外部からデータベースに同時アクセスが行われ、データの一貫性を失わせないよう
//データベースを変更する処理を全て一括して実行し、問題を生じさせないようにする
db.sequelize.sync()
.then(()=>db.User.create({
//レコード作成処理
name:req.body.name,
pass:req.body.pass,
mail:req.body.mail,
age:req.body.age
}))
//create実行後の処理
.then(usr=>{
res.redirect('/users');
});
});
レコードの更新処理も行う。まずは対応するejsを作成。
router.get('/edit', (req, res, next) =>{
db.User.findByPk(req.query.id)
.then(usr=>{
var data={
title:'Users/Edit',
form:usr
}
res.render('users/edit',data);
})
});
router.post('/edit', (req, res, next) =>{
db.sequelize.sync()
.then(()=>db.User.update({
//レコード作成処理
name:req.body.name,
pass:req.body.pass,
mail:req.body.mail,
age:req.body.age
},
{
where:{id:req.body.id}
}))
.then(usr=>{
res.redirect('/users');
});
});
http://localhost:3000/users/edit?id=22で実行することでidの該当者の編集フォームが表示されアップデートできるようになる。
次に削除の確認。
router.get('/delete', (req, res, next) =>{
//findByPkは引数に指定したidのモデルを取得するメソッド
db.User.findByPk(req.query.id)
.then(usr=>{
var data={
title:'Users/Delete',
form:usr
}
res.render('users/delete',data);
})
});
router.post('/delete', (req, res, next) =>{
db.sequelize.sync()
.then(()=>db.User.destroy({
where:{id:req.body.id}
}))
.then(user =>{
res.redirect('/users');
});
});
http://localhost:3000/users/delete?id=22にアクセスして削除処理できるのを確認した。これはシンプル。
ただ、sequelizeを利用する時にもバリデーションを行う必要があり、ここではexpress validatorは使わずに独自の仕組みを使っていく。
ここまではモデルに保管する値についてはDatatypeによる指定のみだったが、ここでバリデーション情報を追加して定義していく。
Modelフォルダのusers.jsを書き換える。
'use strict';
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', {
name: {
type:DataTypes.STRING,
validate:{
notEmpty:true
}
},
pass: {
type:DataTypes.STRING,
validate:{
notEmpty:true
}
},
mail:{
type:DataTypes.STRING,
validate:{
isEmail:true
}
},
age: {
type:DataTypes.INTEGER,
validate:{
isInt:true,
min:0
}
}
}, {});
User.associate = function(models) {
// associations can be defined here
};
return User;
};
Not emptyは未入力の禁止、isemailはメールアドレス形式のみ許可などとなっている。
router.get('/add', (req, res, next) =>{
var data={
title:'Users/Add',
form:new db.User(),//userオブジェクト
err:null//バリデーションエラーの際のエラーオブジェクトを渡すため
}
res.render('users/add',data);
});
router.post('/add', (req, res, next) =>{
const form={
name:req.body.name,
pass:req.body.pass,
mail:req.body.mail,
age:req.body.age,
};
db.sequelize.sync()
.then(()=>db.User.create(form)
.then(usr=>{//成功時の処理
res.redirect('/users')
})
.catch(err=>{//失敗時の処理
var data={
title:'Users/Add',
form:form,
err:err
}
res.render('users/add',data);
})
)
});
ここからはチャットボードの進化版を作成していく。