node mysql パッケージをラップして使う
2018/08/25
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: |