我正在尝试宣传一个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);
我是新编程但我正在努力学习。
答案 0 :(得分:23)
util.promisify是Node 8.X版本的一部分。但是你仍然可以为旧版本的Node提供polyfill。
可以使用polyfill来处理旧版本的节点 您将运行应用程序的服务器。它可以通过安装 npm以下列方式:
npm install util.promisify
现在您可以在旧版本的Node
上修补模块utlconst 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)
以下示例适合您:
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;
此示例使用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