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