Javascript NodeJs util.promisify不是一个函数

Javascript NodeJs util.promisify不是一个函数,javascript,mysql,node.js,Javascript,Mysql,Node.js,我正在尝试promisify一个mysql函数,但当我运行它时,控制台显示此错误util.promisify不是一个函数。这是我的代码: var util=require('util'); var mysql=require('mysql'); var conction=mysql.createConnection({ 主机:'localhost', 用户:'root', 密码:'616897', 数据库:'proyect' }); var query=util.promisify(conco

我正在尝试promisify一个mysql函数,但当我运行它时,控制台显示此错误
util.promisify不是一个函数
。这是我的代码:

var util=require('util');
var mysql=require('mysql');
var conction=mysql.createConnection({
主机:'localhost',
用户:'root',
密码:'616897',
数据库:'proyect'
});
var query=util.promisify(conconnect.query);
查询(data.valida_user)。然后((行)=>{
console.log(行);
}).catch((错误)=>{
console.log(错误);

})
除非您使用的是Node.js 8.x,否则不会定义此函数,这是核心实用程序库的函数


如前所述,您不必安装它。如果您使用的是Node.js 6.x,那么请使用类似的库,它有一个函数。

util.promisify是Node 8.x版本的一部分。但对于旧版本的节点,仍然可以使用多边形填充

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

引用自

以下示例应适用于您:

async()=>{
const connection=await(util.promisify(pool.getConnection.bind(pool));
const fn2=util.promisify(connection.query).bind(connection);
const rows=wait fn2('SELECT col1,col2 FROM user WHERE email=?',[email]);
连接。释放();
返回行;

}
以下是promisify的一个实现:

var promisify=函数(fn){
返回函数(){
var args=[].slice.apply(参数);
回报新的承诺(
功能(解析、拒绝){
应用(
无效的
海螺([
函数(){
var results=[].slice.apply(参数);
(结果[0])//回调的第一个参数为error
?拒绝(结果[0])//错误拒绝
:resolve(results.slice(1,results.length))//使用结果进行解析
}
])
)
}
);
}
};
//使用回调函数具有异步函数的某些对象
//并使用“this”作为调用对象
var callbackApi={
名称:“回调api”,
年龄:22,,
asyncFunction:函数(arg1、arg2、回调){
设置超时(
函数(){callback(null,arg1,arg2,this.name,this.age);}.bind(this),
10
)
}
}
//我的对象将与promisify一起使用api函数
//并使用“this”作为调用对象
变量myObject={
连接:“连接”,
剂量测量:功能(arg){
var asyncFnAsPromise=
//确保将asyncFunction绑定到callbackApi
promisify(callbackApi.asyncFunction.bind(callbackApi));
//使用结果承诺回调api创建的返回承诺
返回asyncFnAsPromise(this.connection,arg)
}
}
myObject.剂量测定法(44)
.那么(
resolve=>console.log(“resolve:”,resolve)
);如果您有/设置,则可以使用。它允许您在节点版本<8中使用
util.promisify
。如果目标节点版本>=8,但希望保持较低版本的向后兼容性,也非常有用

该插件转换以下两种格式编写的代码:

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

您需要在
中设置插件。babelrc

{
  "plugins": [
    "transform-util-promisify"
    ],
    "presets": [
      ["env", {
        "targets": {
          "node": "current"
        }
      }]
    ]
}
对于<8的节点版本,插件将
import
require
转换为。它自动检测版本>=8,并在这些情况下使用本机
util.promisify


披露我是babel plugin transform util promisify的作者和维护者

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

Util包含在节点8.x中,因此如果您可以更新节点,我会这样做。

分享我的工作示例:

我用这个

这是我的database.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

其他人也谈到了解决方案,但这是该错误的另一个来源:

有一个NPM包
es6 promisify
,它也可以给出错误消息
TypeError:promisify不是一个函数
。(这就是为什么我要问这个问题。)

  • 需要5.0.0版es6承诺
    const promisify=require(“es6承诺”)然后使用
    result=promisify(…)

  • 版本6.0.0更改了API,声明更改为
    const{promisify}=require(“es6 promisify”)


并添加带有
npm install util的功能。。。但是我有你也可以使用的de版本v6.11.2,它更快,具有与mysql相同的API,并且支持开箱即用的承诺。正确绑定新函数是我缺少的关键。谢谢这真的很有帮助。谢谢我喜欢这个我只是不明白。你能提供一个链接来解释这一点以及它是如何工作的吗?我在理解const promisify=…=>…=>…=>…=>时遇到困难。。。const是不能更改的var。func(…[1,2])表示与func(1,2)类似,…args表示多个参数。x=>xx表示每个x返回xx。这是一个函数。因此,对于每个f,返回一个函数,该函数将获得…args。为这一职能创造新的承诺。对于具有resolve(a)和reject(b)选项的承诺,返回由…args触发的f(某些函数)的结果,以及一个函数(回调),但在回调调用中,根据错误参数的存在(应始终是第一个参数)返回resolve或reject。因此,最终您将得到一个承诺的函数。Shl,我理解=>的作用,在下一个代码示例“const square=x=>x*x;”,但我仍然不清楚const promisify=f=>(…args)=>。。。。如何读取这两个“=>”序列。另一件事我不清楚,那bind呢?这个承诺正确吗
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
   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)
       }