NodeJs util.promisify не является функцией

Я пытаюсь обещать функцию mysql, но когда я запускаю ее, консоль показывает эту ошибку util.Promisify is not a function. Это мой код:

var util=			require('util');
var mysql=          require('mysql');

var conection=mysql.createConnection({           
				host:'localhost',                   
				user:'root',                        
				password:'616897',               
				database:'proyect'                    
	});
  
  var query = util.promisify(conection.query);
  
  query(data.valida_user).then((rows)=>{
	console.log(rows);
}).catch((error)=>{
	console.log(error);
})

Ответ 1

util.promisify является частью версии Node 8.X. Но у вас может быть polyfill для более старой версии Node.

A polyfill доступен, чтобы позаботиться о более старой версии nodeна серверах, на которых будет запущено ваше приложение. Он может быть установлен через npm следующим образом:

npm install util.promisify

Теперь вы можете исправить модуль utl в более старых версиях Node

const util = require('util');
require('util.promisify').shim();

const fs = require('fs');
const readFileAsync = util.promisify(fs.readFile);

Цитата из http://grizzlybit.info/2017/09/29/Node-JS-8-Util-Promisify/

Ответ 2

Если вы не используете Node.js 8.x, эта функция не будет определена, если она была добавлена в основную библиотеку Utilities.

Поскольку util является базовой библиотекой Node.js, вам не нужно ее устанавливать. Если вы используете Node.js 6.x, то используйте библиотеку, такую как Bluebird, которая имеет функцию promisify.

Ответ 3

Вы можете обещать это самостоятельно, если хотите: const promisify = f => (...args) => new Promise((a,b)=>f(...args, (err, res) => err ? b(err) : a(res)));

Ответ 4

Util включен из Node 8.x, поэтому, если вы можете обновить Node, я бы это сделал.

Ответ 5

Другие люди говорили с решением, но вот еще один источник этой ошибки:

Там пакет NPM es6-promisify который также может выдавать сообщение об ошибке TypeError: promisify is not a function. (Вот почему я дошел до этого вопроса.)

  • Версия 5.0.0 для es6-promisifiy необходима const promisify = require("es6-promisify"); то вы должны использовать result = promisify(... );

  • Версия 6.0.0 имела изменение API, и объявление было изменено на const { promisify } = require("es6-promisify");

Ответ 6

Следующий пример должен работать для вас:

async () => {
  const connection = await (util.promisify(pool.getConnection).bind(pool))();

  const fn2 = util.promisify(connection.query).bind(connection);
  const rows = await fn2('SELECT col1, col2 FROM Users WHERE email = ?', [email]);

  connection.release();

  return rows;
}

Ответ 7

Вот реализация promisify:

var promisify = function(fn) {
  return function(){
    var args = [].slice.apply(arguments);
    return new Promise(
      function(resolve,reject){
        fn.apply(
          null,
          args.concat([
            function(){
              var results = [].slice.apply(arguments);
              (results[0])//first argument of callback is error
                ? reject(results[0])//reject with error
                : resolve(results.slice(1,results.length))//resolve with result(s)
            }
          ])
        )
      }
    );
  }
};

//some object that has async functions using callbacks 
// and using 'this' as invoking object
var callbackApi = {
  name:"callback api",
  age:22,
  asyncFunction:function(arg1,arg2,callback){
    setTimeout(
      function(){callback(null,arg1,arg2,this.name,this.age);}.bind(this),
      10
    )
  }
}

//my object that will use the api functions with promisify
//  and using 'this' as invoking object
var myObject = {
  connection:"connection",
  doSomething:function(arg){
    var asyncFnAsPromise = 
      //make sure to bind asyncFunction to callbackApi
      promisify(callbackApi.asyncFunction.bind(callbackApi));
    //return promise created with result promisified callback api
    return asyncFnAsPromise(this.connection,arg)
  }
}

myObject.doSomething(44)
.then(
  resolve=>console.log("resolve:",resolve)
);

Ответ 8

Если у вас есть настройка webpack/babel, вы можете использовать babel-plugin-transform-util-promisify. Это позволяет использовать util.promisify в версиях узла <8. Также очень полезно, если вы ориентируетесь на версии узла> = 8, но хотите сохранить обратную совместимость для более низких версий.

Плагин преобразует код, написанный в следующих двух форматах:

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

а также

import { promisify } from 'util';

Вам нужно будет установить плагин в вашем .babelrc:

{
  "plugins": [
    "transform-util-promisify"
    ],
    "presets": [
      ["env", {
        "targets": {
          "node": "current"
        }
      }]
    ]
}

Плагин преобразует import и require объявления функции для версий узла <8. Он автоматически определяет версию> = 8 и использует собственный util.promisify в этих случаях.

Раскрытие Я автор и сопровождающий babel-plugin-transform-util-promisify

Ответ 9

Поделитесь своим рабочим примером:

Я использую это промежуточное ПО Promisified MySQL для Node.js

вот моя база данных.js

var mysql = require('mysql'); 

// node -v must > 8.x 
var util = require('util');


//  !!!!! for node version < 8.x only  !!!!!
// npm install util.promisify
//require('util.promisify').shim();
// -v < 8.x  has problem with async await so upgrade -v to v9.6.1 for this to work. 



// connection pool https://github.com/mysqljs/mysql   [1]
var pool = mysql.createPool({
  connectionLimit : process.env.mysql_connection_pool_Limit, // default:10
  host     : process.env.mysql_host,
  user     : process.env.mysql_user,
  password : process.env.mysql_password,
  database : process.env.mysql_database
})


// Ping database to check for common exception errors.
pool.getConnection((err, connection) => {
if (err) {
    if (err.code === 'PROTOCOL_CONNECTION_LOST') {
        console.error('Database connection was closed.')
    }
    if (err.code === 'ER_CON_COUNT_ERROR') {
        console.error('Database has too many connections.')
    }
    if (err.code === 'ECONNREFUSED') {
        console.error('Database connection was refused.')
    }
}

if (connection) connection.release()

 return
 })

// Promisify for Node.js async/await.
 pool.query = util.promisify(pool.query)



 module.exports = pool

Вы должны обновить узел -v> 8.x

вы должны использовать функцию async, чтобы иметь возможность использовать ожидание.

пример:

   var pool = require('./database')

  // node -v must > 8.x, --> async / await  
  router.get('/:template', async function(req, res, next) 
  {
      ...
    try {
         var _sql_rest_url = 'SELECT * FROM arcgis_viewer.rest_url WHERE id='+ _url_id;
         var rows = await pool.query(_sql_rest_url)

         _url  = rows[0].rest_url // first record, property name is 'rest_url'
         if (_center_lat   == null) {_center_lat = rows[0].center_lat  }
         if (_center_long  == null) {_center_long= rows[0].center_long }
         if (_center_zoom  == null) {_center_zoom= rows[0].center_zoom }          
         _place = rows[0].place


       } catch(err) {
                        throw new Error(err)
       }