NodeJs util.promisify不是一个函数

时间:2017-09-28 19:18:18

标签: javascript mysql node.js

我正在尝试宣传一个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);
})

如果是同样的错误 var query = util.promisify(mysql.query);

我是新编程但我正在努力学习。

8 个答案:

答案 0 :(得分:23)

util.promisify是Node 8.X版本的一部分。但是你仍然可以为旧版本的Node提供polyfill。

  

可以使用polyfill来处理旧版本的节点   您将运行应用程序的服务器。它可以通过安装   npm以下列方式:

npm install util.promisify
     

现在您可以在旧版本的Node

上修补模块utl
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/

答案 1 :(得分:7)

除非您使用Node.js 8.x,否则无法定义此功能,即when it was added到核心 Utilities 库。< / p>

作为util is a core Node.js library,您不必安装它。如果您正在使用Node.js 6.x,请使用Bluebird之类的库,该库具有promisify功能。

答案 2 :(得分:4)

如果您愿意,您可以自己承诺: const promisify = f => (...args) => new Promise((a,b)=>f(...args, (err, res) => err ? b(err) : a(res)));

答案 3 :(得分:4)

Util包含在Node 8.x中,因此如果您可以更新节点I,请执行此操作。

答案 4 :(得分:3)

其他人已经讨论了该解决方案,但这是此错误的另一个来源:

有一个NPM软件包es6-promisify,它也可以给出错误消息TypeError: promisify is not a function。 (这就是为什么我问这个问题。)

  • 需要es6-promisifiy版本5.0.0 const promisify = require("es6-promisify");,然后使用result = promisify( ... );

  • 版本6.0.0更改了API,并且声明更改为const { promisify } = require("es6-promisify");

答案 5 :(得分:1)

以下示例适合您:

&#13;
&#13;
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;
}
&#13;
&#13;
&#13;

此示例使用Node.js的标准MySQL模块。 util.promisify是Node.js的内置实用程序。使用节点8。

代码被包装到异步函数中。在第一行中,回调函数'pool.getConnection'被转换为promises,并使用附加的'await'语句立即调用​​。这将创建一个异步函数序列并返回一个值(一个连接)而不是一个函数或promises。下一行对'conection.query'执行相同操作,但为简单起见,将代码拆分为两个语句。最后,该函数返回查询结果,就像任何同步函数一样。

答案 6 :(得分:0)

这是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)
);

答案 7 :(得分:0)

分享我的工作范例:

我使用此Promisified MySQL middleware for Node.js

这是我的database.js

archive <- list.files(directory, full.names = TRUE)
datapollution <- do.call(rbind, lapply(archive, read.csv))

您必须升级节点-v&gt; 8.x

您必须使用异步功能才能使用等待。

示例:

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