Node.js: как наиболее простым способом применить util.promisify к пулу mysql? - PullRequest
0 голосов
/ 17 февраля 2019

Я видел другой поток и и сообщение Создайте промежуточное программное обеспечение базы данных MySQL с Node.js 8 и Async / Await , но сейчас я просто хочу использовать util.promisifyсамым простым и понятным способом, который я могу представить, применяя его к mysql connection-pool.Что касается документации Node.js , ниже приведен мой фрагмент кода:

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);
  });

};

Код, который я закомментировал, прекрасно работает без promisify.Но похожий код с promisify не работает и показывает TypeError: Cannot read property 'connectionConfig' of undefined.Что не так с кодом?

версия узла = v8.1.4

Ответы [ 2 ]

0 голосов
/ 09 августа 2019

Перед тем, как поделиться своим примером, вот более подробная информация о методе связывания и асинхронной функции .

const mysql = require('mysql')
const { promisify } = require('util')

const databaseConfig = {
  connectionLimit : 10,
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME
}

const pool = mysql.createPool(databaseConfig)
const promiseQuery = promisify(pool.query).bind(pool)
const promisePoolEnd = promisify(pool.end).bind(pool)

const query = `select * from mock_table limit 1;`
const result = await promiseQuery(query) // use in async function

promisePoolEnd()

0 голосов
/ 17 февраля 2019

Всегда следует ожидать, что метод зависит от контекста, если не доказано иное.

Поскольку pool.query является методом, он должен быть привязан к правильному контексту:

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

Это может быть ненужным, поскольку существуют альтернативы на основе обещаний для большинства популярных библиотек, которые могут использовать обещания, , включая mysql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...