LoginSignup
3
3

More than 5 years have passed since last update.

新卒研修で作ったアプリケーションをNode.jsで書き直していく話(進捗)

Last updated at Posted at 2015-12-22

はじめに

この記事はアイスタイルアドベントカレンダー22日目の記事であり、
11日目の新卒研修で作ったアプリケーションをNode.jsで書き直していく話(序章)の続きの記事となります。

まずはじめに、

進捗ダメです!!!!

今のところ終わっている作業は下記の通りになります。

  1. DBの設計
  2. 技術選定
    1. Exprescs
    2. gulp
    3. Babel(ES2015)
  3. 実装
    1. ユーザー追加(途中)

以上です!!
なんともお粗末な結果になってしまっていますが、とりあえず詳細な進捗報告をしたいと思います。

DBの設計

DBは下記のような構成になっています。

テーブル名 詳細
capsule_types 選べるカプセルのタイプ(マスタ)
items 商品(マスタ)
order_logs 注文のログ(トランザクション)
orders 当月分の注文(トランザクション)
users ユーザー情報(マスタ)

以前は非常に無駄なマスタテーブルが複数あったため、それらをすべて削除し、凄まじくシンプルな構成にしました。

技術選定

WAFは、Express(特に何も考えず決めました)を使い、BabelでES2015の文法を用いながら書いています。Class最高です。

また、ビルドツールとしてgulpを用いることで、常に変化をwatchしながらトランスパイルしています。
まだgulptaskも育てられていないので、今後育てていきます。

実装

実装は、ユーザーの追加機能を作っている途中です。
フォームから渡されたデータにバリデーションをかけたり、パスワードをハッシュ化したりして登録するという当たり前のことしかやっていません。
アプリケーションの構成は以下のようになっています。

  1. route
  2. service
  3. dao
  4. view

ここも詰め切れていないオレオレ設計になっています・・・
徐々にDDDに寄せていこうと思っています。

実装時にハマったポイント

まだほぼ機能を作っていないんですが、Node.js独特のハマりポイントに見事にハマったので、それをちょっと説明しておきます。
ハマったポイントは、非同期の部分です。
MySQLへのデータ登録時にレスポンスがundefinedになっていたことからすべてが始まりました・・・(といっても30分ぐらいで解決できましたがw)

悩んだ部分は下記の通り。

  1. レスポンスの返り値がundefined
  2. 例外処理がうまくいかない

以上、2点です。

解決策としてのPromise

このハマリポイントを解決してくれたのが、Promiseでした。
初めて使いましたが、Promise最高です。

Promiseの詳しい内容については、下記を参照してください。
JavaScript Promiseの本

今回は上記の通り、mysqlでのユーザー登録が成功した場合に、resolveを失敗してコールバックにエラーが渡された場合にrejectを実行するようになっています。
実装は下記の通り。

userdao.js
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);
      }
    });
  });
}

ここでのレスポンスを下記のように受けています。

singup.js

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についての何かです!!!

3
3
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
3
3