#仕事で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だからか、コードはカオスになりやすいです。
なんとなくで書けてしまうから、怖いなと思います。
でも、性能はいいみたいで捌けるリクエスト数は結構いいみたいです。
見た目はいいけど中身がねってヤツです。
ああ、綺麗に書けるようになりたいなと思う今日この頃です。