Node+Express+MySQL備忘録

Node+Express+MySQLでチャットを作成しました。
その際に、いくつか詰まった点があるので、その点を纏めたいと思います。


1. app.jsで使用している変数をルーティングファイルで使用する
やりたいこと⇒現在のログインユーザをapp.jsで保持しておき、チャット画面にアクセスした際にその人数を取得したい

app.js(サーバ本体)

app.get('/', routes.index);
//中略
var context = module.exports = express.createServer();
var user = getUserCount(); // getUserCount()はログインユーザを取得する処理
context.set('user',user); // userという変数で格納しておく

index.js(ルーティングファイル)

exports.index = function(req, res){
var userList = module.parent.exports.set('user');
};

以上のようにすることで、app.jsで定義した情報が取得できる。
「a=b=c」という書き方は多重代入子と言う。知らなかったがjavaでも出来る。

以上の記述は、
http://d.hatena.ne.jp/sugyan/20120110/1326197416
を参考にした。

2. MySQLの接続(2回目以降)でエラーになる
MySQLとの接続はライブラリ(⇒https://npmjs.org/package/mysql)を使用した。バージョンは「2.0.0-alpha7」。
https://github.com/felixge/node-mysqlにあるIntroductionを少し修正しつつ、ほぼその通りに記述。
http://qiita.com/items/2463b0e4a026c0fd86e4等のページも参考にさせて頂いた。

var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost', //接続先ホスト
user : 'node', //ユーザー名
password : 'success', //パスワード
database : 'node' //DB名
});

socket.on('message',function(data){
connection.connect();

var selectSql = 'SELECT * FROM chat;'
connection.query(selectSql)
.on('result', function(rows) {
// コンソールに結果を表示
console.log('result: ', rows);
});

connection.end();
}

Cannot enqueue Handshake after invoking quit.

この状態でサーバを起動させると、二回目以降の接続で上記のエラーメッセージが表示される。
エラーメッセージで検索すると以下のページが表示される。
http://stackoverflow.com/questions/13266013/when-to-close-mysql-connection-using-node-mysql
どうやら、一度接続を切ると再接続出来ない仕様であるよう。
ならconnection.end()しなければ良いのか?
と思い、上記の一行をコメントアウトして再び実行。

Cannot enqueue Handshake after already enqueuing a Handshake.

今度は上記のエラーメッセージが表示される。
どうすればいいんだと頭を抱え、再びエラーメッセージで検索。
http://stackoverflow.com/questions/13872434/sifting-through-node-js-express-and-mysql-module
上記はDBクラスを作成しているため少し違うのだが、参考になった。
つまり二度connectionを実行しているために発生しているエラーだ。
調べてみると、connectionが接続されていない場合、connection.query関数内で接続を行っているようだ。

// 設定部分省略

socket.on('message',function(data){
var selectSql = 'SELECT * FROM chat;'
connection.query(selectSql)
.on('result', function(rows) {
// コンソールに結果を表示
console.log('result: ', rows);
});
}

結局上記のコードに落ち着いた。
connection.end()を実行したいのであれば、https://github.com/felixge/node-mysqlのServer disconnectsのコードを追加すると再接続が可能になる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です