node.js v0.11.0 化への試行メモ
自メモ)
npm install mysql で最新にすると動くnodeプロジェクト と 古いままじゃないと動かんプロジェクトがあるのは何故だ??わけわからず。。。 client.connect console.log("err=" + err) => err=null 状態
node.js v0.11.0 でなぜか mysql plugin 古いままでも動くようになってるし。。<v0.10.Xベースだとエラーで手動かなかった。JSの領域が干渉してるのかな。。。(汗
node.js v0.11.0 ベースだとres.download の段階で uncaughtException => TypeError: Arguments to path.join must be strings 消えず。。。
TypeError: Arguments to path.join must be strings って出ちゃうのは URL でカンマ2つあるからだろうか。。。とりあえず node v0.8.22ではエラーでないのでちょっと保留
変に短縮されたが
の時どうも誤動作してるっぽい。
hogehoge-XXX.XXX.dat
express 自体を更新してみても効果なし
追記)
現在テスト環境が
次の日になってると繋がらなくなっている状態(reconectが発行されていないよう)
最新版入れるなら
npm install mysql@2.0.0-alpha7
npm install express@3.0.0beta7
な感じで [モジュール名@バージョン] の形式で指定
node.js更新自体
curl -O http://nodejs.org/dist/v0.11.0/node-v0.11.0.tar.gz
tar -xvzf node-v0.11.0.tar.gz
cd node-v0.11.0
./configure
sudo make
sudo make install
前verに戻す場合
curl -O http://nodejs.org/dist/v0.8.22/node-v0.8.22.tar.gz
tar -xvzf node-v0.8.22.tar.gz
cd node-v0.8.22
./configure
sudo make
sudo make install
すでにmake済みなら
で上書きすればOK。
sudo make install
- mysql plugin 最新化
npm install mysql
DB接続処理>
旧)
- node_modules/hogeDBM.js
exports.connectDB = function() { var client = mysql.createClient({ user: exports.user, password: exports.password, host: exports.host, database: exports.database }); return client; }
メイン側>
- hogeServer.js
var db = require('hogeDBM'); var client = db.connectDB(); app.configure(function (){ app.use(parted({ path: __dirname + '/tmp', multiple:true })); app.enable('jsonp callback'); app.register('.ejs', ejs); app.set('view options', { layout: false }); }); //DB再接続チェック & 再接続処理 if(client==null || !client.connected){ console.log('====[/list] reconect_db===='); if(client!=null)client.end(); client = db.connectDB(); if(client==null || !client.connected){ process.exit(); return; } } process.on('uncaughtException', function (err) { console.log('uncaughtException => ' + err); process.exit(); });
新)
- node_modules/hogeDBM.js
exports.connectDB = function() { var client = mysql.createConnection({ user: exports.user, password: exports.password, host: exports.host, database: exports.database, insecureAuth:true }); client.connect(function(err) { // connected! (unless `err` is set) console.log("err="+err); }); handleDisconnect(client) return client; } function handleDisconnect(connection){ myconnection.on('error', function(err){ console.log('\nRe-connecting lost connection: ' + err.stack); // connection.destroy(); if(connection!=null)connection.end(); connection = mysql.createConnection({ user: exports.user, password: exports.password, host: exports.host, database: exports.database, insecureAuth:true }); handleDisconnect(connection); // connection.connect(); }); }
メイン側>
- hogeServer.js
var db = require('hogeDBM'); var client = db.connectDB(); app.configure(function (){ app.use(parted({ path: __dirname + '/tmp', multiple:true })); app.enable('jsonp callback'); //app.register('.ejs', ejs); //☆エラーが出るのでコメント app.set('view options', { layout: false }); }); process.on('uncaughtException', function (err) { console.log('uncaughtException => ' + err); if(client!=null)client.end(); process.exit(); });
検索メモ)
fibers 辺使えって話が出てくるんだけど
- fibers on node.js事始め - Qiita
- http://blog.craftgear.net/4f8ec05267e83a233e000001/title/%E9%9D%9E%E5%90%8C%E6%9C%9F%E7%A5%AD%E3%82%8A%E3%82%92%E4%B9%97%E3%82%8A%E5%88%87%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEsynchronize(%E3%81%A8asyncblock)%20
同期化自体は
現在は node-asyncあたりでやってる感じ
どっちがいい感じなんだろう?
node.js A)async.waterfall B)async.parallel と記述してしまうと A処理設定後に B処理設定も 走ってしまってる感じのよう うーん。シーケンシャルににしか処理をかけないのが痛し痒し
async.parallel はどうも単純な形式でないとうまく動かせないみたい function(callback) { callback(null, resA) function(callback) { callback(null, resB)
受けがfunction finish(err, results) { callbackM( results[0], //resA results[1]);//resB}
express3だとejsを標準サポートせず jade使え か そういうプロジェクトテンプレート作れ って出てくるんだけど 既存のそれできないよなー><。なんだこれ。。express-ejs-layouts あたりも使い方難しそう URL
ようは handleDisconnect のcallback系が動いてないんだよな。。これ接続エラーだけなんだっけ(でもコレも動いてないような。。。一番簡単な解決策は手動で handleDisconnect の関数をエラー時に呼ぶみたいな作りになってしまう
JAVAと同じように(node.JS でも) query-error も throws err; で投げろってなってるけどどうなんだろうな(既存コードは全部丸めてる感じだったりする)エラーでてもとりあえず動けみたいな実装方針だったんだろうなと 遠い目
node.js)
express3)
- http://blog.craftgear.net/4f6fd9c32ea0435951000001/title/%E6%97%A5%E6%9C%AC%E6%9C%80%E9%80%9Fexpress3%E5%85%A5%E9%96%80
- http://blog.craftgear.net/50186114d0bf7ac340000001/
- Redirecting…
@kimukou2628 それ以降処理が実行されないことを明示てきにしたいんじゃないですかね?コールバックで結果返した後にも、なぜかコード書いててはまったりしたことがあるのでそう思いました。最近はreturn cb();みたいに、するように私はなりました
2013-04-15 12:14:46 via HootSuite to @kimukou2628
@sekitaka_1214 あともう一つ疑問に思っているのは if (callback)callback(null); なコードも既存にあるのですが、これは上位からcallbackが指定されていないときに落ちないようにする対策だったりするのでしょうか?
@kimukou2628 私はそーゆー理解です。typeofで、厳密に関数かチェックしているコードも、見かけたことがあるので。
2013-04-15 12:29:49 via HootSuite to @kimukou2628
node.js mysql var result= [];q.on('result', function(row) { results.push(row); }q.on('end', function() { return cb(result);}って書くんか
node mysqlログで handleDisconnect が動いているような挙動が出てたんだけどhandleDisconnect(connection); connection.connect(); の順序逆にしないとエラーが出て駄目っぽい。直して様子を見るかな。。