Node.js は –harmony を付けて起動、 io.js ならそのまま使えるのでちょろい。
まず、node-mysql (node-mysql2) の createConnection を使う場合。そこまで変なことしないで thunkify(db.query.bind(db)) にだけ気をつけたらいけます。
ググるとこの方法使ってるのよく見ます。
var mysql = require('mysql2'), thunkify = require('thunkify'), co = require('co'); var db = mysql.createConnection({host: '***', user: '***', password: '***'}), query = thunkify(db.query.bind(db)); co(function* () { var res = yield query('SELECT * FROM hoge'); console.log(res); db.end(); })
そして、createPoolを使う場合。
pool.getConnection(function(err, db){}) をやってから thunkify(db.query.bind(db)) とするのでちょっと面倒臭いです。
// pool connection 普通のやつ var pool = mysql.createPool({ ... }); pool.getConnection(function(err, db) { db.query(' ... ', function(e, res) { console.log(res); }); db.release(); });
このなんかすっきりしないコールバックを下のような感じにすれば、それなりに便利な書き方ができるんじゃないでしょうか。
// pool connection + thunkify var mysql = require('mysql2'), thunkify = require('thunkify'), co = require('co'), pool; function* getConn() { if (!pool) pool = mysql.createPool({host: '***', user: '***', password: '***'}); var db = yield thunkify(pool.getConnection.bind(pool))(), query = thunkify(db.query.bind(db)); // db.query を残したまま ES6 generator 用の db.exec を作る db.exec = function* () { return yield query.apply(null, arguments); } return db; } co(function* () { var db = yield getConn(), res = yield db.exec('SELECT * FROM hoge'); console.log(res); db.release(); })
ちょっと長くなったような気もしますが、 co(function* () … の中身がスッキリして見やすくなりました。
今使ってるio.jsのオレオレRSSリーダーでcreateConnectionよりcreatePoolの方がほんの少し速いので、しばらくこれでいこうかなと。