node mysql パッケージをラップして使う

node で作ったので、データストアをmongodbなどにするのが普通かもしれないけど、今回はmysqlにしました。

mysqlパッケージをそのまま使うのもよいけど、コネクションプーリングをしたかったり、その他に便利メソッドを追加することもできるということで、dbパッケージを経由して使うようにしました。

query_list_for more

このサイトでは、一覧は、6件表示して「もっと読む」ボタンで次の6件をajaxで挿入するという仕様にしました。

もっと読むの時もほとんど同じsql書くの面倒だよね。ということで、最初の検索時(query_list_forメソッド)に、sqlとパラメータをセッションに保存しておき、もっと読むのときは、何も指定しなくてもmoreメソッドで次の6件が取得できるようにしてみました。 かなり強引な手法ですが、コードはだいぶ減りました。

closeメソッドは何もしてないんですが、何もしなくてもリリースされているようなログが出ているので、クローズ的なことはしてません。

var config = require('config');
 const mysql = require('mysql');function DB(){this.conn = mysql.createPool({ connectionLimit : 10, host: config.mysql.host, user: config.mysql.user, password: config.mysql.password, database: config.mysql.dbname, charset: 'utf8mb4',});this.open = function(){return this.conn;};this.close = function(){//    this.conn.end();};this.query_list_for = function(){var name = arguments[0];var req = arguments[1];var sql = arguments[2];var params = arguments[3]; console.log('sql', sql); console.log('session', req.session);if (!('query_list_for' in req.session)) { req.session.query_list_for = {};} req.session.query_list_for[name] = { sql: sql, params: params,};return this.conn.query.apply(this.conn, [].slice.call(arguments, 2));};this.more = function(){ console.log('more');var name = arguments[0];var page = arguments[1];var req = arguments[2]; console.log('session', req.session);var param = req.session.query_list_for[name]; console.log('param', param);var sql = param.sql.replace(/limit.*/, '') + 'limit 6 offset ' + page * 6;var args = [sql, param.pramas].concat([].slice.call(arguments, 3));return this.conn.query.apply(this.conn, args);};this.query = function(){return this.conn.query.apply(this.conn, arguments);};this.conn.on('connection', function (connection) { console.log('pool connection');});this.conn.on('enqueue', function () { console.log('pool enqueue');});this.conn.on('release', function (connection) { console.log('pool release %d', connection.threadId);});}
 var conn = new DB();
conn.open();var db = { open: function(){return conn;},}
 
module.exports = db;// vim: set ts=2 sts=2 sw=2 expandtab ai:

コメントする

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


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください