Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js: how to apply util.promisify to mysql pool in its simplest way?

I saw another thread and and the post Create a MySQL Database Middleware with Node.js 8 and Async/Await, but right now I just want to use the util.promisify in the most simplest and straight-forward way that I can think, applying it to mysql connection-pool. Regarding the Node.js documentation, bellow is my code snipet:

exports.genAdminCfg = function (app) {
  let sql = 'SELECT * FROM nav_tree;';

  let pool = require('mysql').createPool({
    host: 'localhost',
    user: 'root',
    password: 'mysql',
    database: 'n4_ctrl',
    connectionLimit: 4,
    multipleStatements: true
  });

  /* --- Works fine without "promisify":
   pool.query(sql, function (err, rows) {
     if (err) {
       console.log(err);
       return err;
     } else {
       app.locals.adminCfg = genCfg(rows);
       app.locals.adminCfg.dbConnectionPool = pool;
     }
   });
  */

  /* --- Does not worke with "promisify":
     TypeError: Cannot read property 'connectionConfig' of undefined
       at Pool.query (/usr/home/zipper/node/n4.live/node_modules/mysql/lib/Pool.js:194:33)
  */
  require('util').promisify(pool.query)(sql).then(function (rows) {
    app.locals.adminCfg = genCfg(rows);
    app.locals.adminCfg.dbConnectionPool = pool;
  }, function (error) {
    console.log(error);
  });

};

The code I commented-out works fine without promisify. But the similar code next to it with promisify does not work and shows TypeError: Cannot read property 'connectionConfig' of undefined. What's wrong with the code?

node version = v8.1.4

like image 907
zipper Avatar asked Feb 17 '19 06:02

zipper


1 Answers

It always should be expected that a method relies on the context, unless proven otherwise.

Since pool.query is a method, it should be bound to correct context:

const query = promisify(pool.query).bind(pool);

This may be unneeded because there are promise-based alternatives for most popular libraries that could make use of promises, including mysql.

like image 76
Estus Flask Avatar answered Sep 28 '22 00:09

Estus Flask