Edited at
gumi Inc.Day 23

Node.jsでthen,then,then世

More than 1 year has passed since last update.


仕事でNode.jsを使用してみての感想とか愚○・・・

(注)タイトルは少し皮肉ってます。。。


使用した主なモジュール

bluebird

http://bluebirdjs.com/docs/getting-started.html

lodash

https://lodash.com/docs

Express

http://expressjs.com/ja/

sequelize

http://docs.sequelizejs.com/en/v3/


愚○


thenがやたら多い。。。

使っているバージョンが少し古いこともあって

js

Promise.resolve()

.then(function(){})

.then(function(){})

.then(function(){})



こんな感じで非同期の内容をチェインし続けないと

同じ非同期として扱ってくれない・・・

どれだけthenを書けば・・・

まさにthen,then,then世

最新ではジェネレーターとか使ってもう少しわかりやすくかける模様


thisがコロコロ変わる・・・

javascriptではチェインなどで繋いでいる関数でthisを呼び出すと

thisが思っているのと違うのになる。

これがPromiseのチェインが多発するNodeだと

中々気付きにくいバグになる・・・

対応策として

js

var self = this;

Promise.resolve()

.then(function(){

     self.hoge();

})



とするか

js

Promise.bind(this)

.then(function(){

     this.hoge();

})



とするとthisは変わらない。

どっちにしても、めんどい・・・


bluebird(Promise)を使って気をつけた方がいいところ

Promise.allやPromise.mapはそのまま使うと

配列の量が大きいとかなりのCPUを使用してしまいました。

また、外部のサービス(redisやmysql)とかを使用する際は

コネクション数やCPU使用率があがり、サービスの提供に支障がでてしました。

なるべく、Promise.reduceやPromise.eachを使うようにした方が

安定したサービスを提供できました。


個人的に入れないと辛いと思ったプラグイン

(エディタはvimでした。)

Eslint

http://eslint.org/

チェックツール。セミコロン忘れとかの防止に

vim-node

https://github.com/moll/vim-node

gfでrequrire先に一発で飛べる


sequelize

ORマッパーです

よく使うメソッド

js

     return this.findOrBuild({

          where:{

               key: 'fuga'

          }

     })

     .spread(function(instance, initialized){

          return instance.save();

     })



みたいな感じで使ったりします。

findOrBuildはレコードがあれば、レコードの内容をもった

sequelizeのインスタンスを返します。

なければ、デフォルト値とwhereで指定した値をもった

sequelizeのインスタンスを返します。

気をつけないといけないのが

updateという関数をもっているのですが、これは更新した

レコード数しか返さないので、更新した内容のインスタンスが欲しい場合は

saveがオススメです。

(saveメソッドはなければ、insertあればupdateです。)

トランザクション

トランザクション中、同じDBに繋ぐ際はコネクションを共通したもので

繋がないとコネクションが1つ増えてしまう。

これが地味にめんどい。。。

js

     sequelize.transaction(function (t) {

          return hogeModel.find({

               where:{key: 'hoge'}

          })

          .then(function(result){

               fugaModel.find({

                    where:{id: result.id},

                         transaction: t

               })

          });



こんな感じだとコネクションが増えます・・・

怖い・・・


感想

ほとんどが愚○でした・・・

まだまだ、ありますがここら辺で止めておきます。

全体的にjavascriptだからか、コードはカオスになりやすいです。

なんとなくで書けてしまうから、怖いなと思います。

でも、性能はいいみたいで捌けるリクエスト数は結構いいみたいです。

見た目はいいけど中身がねってヤツです。

ああ、綺麗に書けるようになりたいなと思う今日この頃です。