0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

gumi Inc.Advent Calendar 2016

Day 23

Node.jsでthen,then,then世

Last updated at Posted at 2016-12-23

#仕事で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がやたら多い。。。
使っているバージョンが少し古いこともあって

Promise.resolve()
.then(function(){})
.then(function(){})
.then(function(){})

こんな感じで非同期の内容をチェインし続けないと
同じ非同期として扱ってくれない・・・
どれだけthenを書けば・・・
まさにthen,then,then世

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

###thisがコロコロ変わる・・・
javascriptではチェインなどで繋いでいる関数でthisを呼び出すと
thisが思っているのと違うのになる。
これがPromiseのチェインが多発するNodeだと
中々気付きにくいバグになる・・・

対応策として

var self = this;
Promise.resolve()
.then(function(){
     self.hoge();
})

とするか

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マッパーです
よく使うメソッド

     return this.findOrBuild({
          where:{
               key: 'fuga'
          }
     })
     .spread(function(instance, initialized){
          return instance.save();
     })

みたいな感じで使ったりします。
findOrBuildはレコードがあれば、レコードの内容をもった
sequelizeのインスタンスを返します。
なければ、デフォルト値とwhereで指定した値をもった
sequelizeのインスタンスを返します。

気をつけないといけないのが
updateという関数をもっているのですが、これは更新した
レコード数しか返さないので、更新した内容のインスタンスが欲しい場合は
saveがオススメです。
(saveメソッドはなければ、insertあればupdateです。)

トランザクション
トランザクション中、同じDBに繋ぐ際はコネクションを共通したもので
繋がないとコネクションが1つ増えてしまう。
これが地味にめんどい。。。

     sequelize.transaction(function (t) {
          return hogeModel.find({
               where:{key: 'hoge'}
          })
          .then(function(result){
               fugaModel.find({
                    where:{id: result.id},
                         transaction: t
               })
          });

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

感想

ほとんどが愚○でした・・・
まだまだ、ありますがここら辺で止めておきます。
全体的にjavascriptだからか、コードはカオスになりやすいです。
なんとなくで書けてしまうから、怖いなと思います。
でも、性能はいいみたいで捌けるリクエスト数は結構いいみたいです。
見た目はいいけど中身がねってヤツです。
ああ、綺麗に書けるようになりたいなと思う今日この頃です。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?