はじめに
この記事はアイスタイルアドベントカレンダー22日目の記事であり、
11日目の新卒研修で作ったアプリケーションをNode.jsで書き直していく話(序章)の続きの記事となります。
まずはじめに、
進捗ダメです!!!!
今のところ終わっている作業は下記の通りになります。
- DBの設計
- 技術選定
3. Exprescs
4. gulp
5. Babel(ES2015) - 実装
4. ユーザー追加(途中)
以上です!!
なんともお粗末な結果になってしまっていますが、とりあえず詳細な進捗報告をしたいと思います。
DBの設計
DBは下記のような構成になっています。
テーブル名 | 詳細 |
---|---|
capsule_types | 選べるカプセルのタイプ(マスタ) |
items | 商品(マスタ) |
order_logs | 注文のログ(トランザクション) |
orders | 当月分の注文(トランザクション) |
users | ユーザー情報(マスタ) |
以前は非常に無駄なマスタテーブルが複数あったため、それらをすべて削除し、凄まじくシンプルな構成にしました。
技術選定
WAFは、Express(特に何も考えず決めました)を使い、BabelでES2015の文法を用いながら書いています。Class最高です。
また、ビルドツールとしてgulpを用いることで、常に変化をwatchしながらトランスパイルしています。
まだgulptaskも育てられていないので、今後育てていきます。
実装
実装は、ユーザーの追加機能を作っている途中です。
フォームから渡されたデータにバリデーションをかけたり、パスワードをハッシュ化したりして登録するという当たり前のことしかやっていません。
アプリケーションの構成は以下のようになっています。
- route
- service
- dao
- view
ここも詰め切れていないオレオレ設計になっています・・・
徐々にDDDに寄せていこうと思っています。
実装時にハマったポイント
まだほぼ機能を作っていないんですが、Node.js独特のハマりポイントに見事にハマったので、それをちょっと説明しておきます。
ハマったポイントは、__非同期__の部分です。
__MySQLへのデータ登録時にレスポンスがundefined__になっていたことからすべてが始まりました・・・(といっても30分ぐらいで解決できましたがw)
悩んだ部分は下記の通り。
- レスポンスの返り値がundefined
- 例外処理がうまくいかない
以上、2点です。
解決策としてのPromise
このハマリポイントを解決してくれたのが、__Promise__でした。
初めて使いましたが、Promise最高です。
Promiseの詳しい内容については、下記を参照してください。
JavaScript Promiseの本
今回は上記の通り、mysqlでのユーザー登録が成功した場合に、resolveを失敗してコールバックにエラーが渡された場合にrejectを実行するようになっています。
実装は下記の通り。
add(name, email, password) {
let sql = "insert into users set name = ?, email = ?,password = ?";
let prepare = [name, email, password];
sql = connection.format(sql, prepare);
return new Promise(function(resolve,reject) {
connection.query(sql, function(err, result) {
console.log(err);
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
}
ここでのレスポンスを下記のように受けています。
result.then(function(success) {
req.session.email = req.body.email;
res.redirect(301, '/users');
}).catch(function(err) {
res.render('singup', { errors: [{msg: 'ユーザー登録に失敗しました。'}]});
});
Promise最高!
最後に
早くも最後になってしまいました。
今後も実装を続けていき年末までに完成させようと思います!
アプリについては、ktarow.comという自前のブログに書こうかなと思っています。
以上、最後まで読んでいただきありがとうございました!
明日は、@ytakeさんによるgoについての何かです!!!