Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

はじめに

この記事はアイスタイルアドベントカレンダー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についての何かです!!!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away