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:

コメントする

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


The reCAPTCHA verification period has expired. Please reload the page.

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