node-mysqlのコールバック地獄をES6 GeneratorとPromiseでなんとかする

node-mysqlのコールバック地獄をthunkifyでなんとかする でやったthunkify使わずにPromiseでやるやつです。

thunkifyより柔軟な処理ができるかもしれません。
db.query(‘SELECT … ‘, function(err, rows) {}) の代わりにPromiseな db.exec() も同じように用意してます。

'use strict';
// pool connection + Promise
var mysql = require('mysql2'),
    pool;

function getPoolConnection() {
    if (!pool) pool = mysql.createPool({host: '***', user: '***', password: '***'});
     return new Promise(function(resolve, reject) {
         pool.getConnection(function(err, connection) {
             if (err) {
                 reject(err);
             } else {
                 // conn.exec = <Promise>
                 connection.exec = function(query) {
                     return new Promise(function(res, rej) {
                         connection.query(query, function(err, rows) {
                             err ? rej(err) : res(rows);
                         });
                     });
                 }
                 resolve(connection);
             }
         });
     });
}
// then, catchを使う…… と、あまり変わらないけれど
function example1() {
    getPoolConnection()
        .then(function(db) {
            db.exec('SELECT * FROM ... ')
              .then(function(rows) {
                  console.log(rows);
                  db.release();
              })
        })

}

// generator functionを使う
function* example2() {
    var db = yield getPoolConnection();
    var res = yield db.exec('SELECT * FROM ....');
    console.log(res);
    db.release();
}

// coでもいい
co(function* () {
    var db = yield getPoolConnection();
    var res = yield db.exec('SELECT * FROM ....');
    console.log(res);
    db.release();
})

コメントを残す

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