J'essaie de promettre une fonction mysql mais lorsque je l'exécute, la console affiche cette erreur util.Promisify is not a function
. Ceci est mon code:
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);
})
La même erreur si var query = util.promisify(mysql.query);
Je suis une nouvelle programmation mais j'essaie d'apprendre.
util.promisify fait partie de la version de Node 8.X. Mais vous pouvez toujours avoir un polyfill pour l'ancienne version de Node.
Un polyfill est disponible pour prendre en charge l'ancienne version de node serveurs sur lesquels vous allez exécuter votre application. Il peut être installé via npm de la manière suivante:
npm install util.promisify
Vous pouvez maintenant patcher le module utl sur les anciennes versions de Node
const util = require('util'); require('util.promisify').shim(); const fs = require('fs'); const readFileAsync = util.promisify(fs.readFile);
Cité de http://grizzlybit.info/2017/09/29/Node-JS-8-Util-Promisify/
Sauf si vous utilisez Node.js 8.x, cette fonction ne sera pas définie, c'est quand elle a été ajoutée à la bibliothèque principale Utilities.
Comme util
est une bibliothèque Node.js principale , vous ne devriez pas avoir à l’installer. Si vous utilisez Node.js 6.x, utilisez une bibliothèque telle que Bluebird qui a une fonction promisify
.
Util est inclus à partir du nœud 8.x, donc si vous pouvez mettre à jour le nœud je le ferais.
Vous pouvez le promettre par vous-même si vous voulez: const promisify = f => (...args) => new Promise((a,b)=>f(...args, (err, res) => err ? b(err) : a(res)));
D'autres personnes ont parlé de la solution, mais voici une autre source de cette erreur:
Il existe un package NPM es6-promisify
qui peut également donner le message d'erreur TypeError: promisify is not a function
. (C'est pourquoi je suis arrivé à cette question.)
La version 5.0.0 de es6-promisifi a besoin de const promisify = require("es6-promisify");
alors vous utiliseriez result = promisify( ... );
La version 6.0.0 comportait un changement d'API et la déclaration changée en const { promisify } = require("es6-promisify");
L'exemple suivant devrait fonctionner pour vous:
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;
}
Cet exemple utilise le module MySQL standard pour Node.js. Et util.promisify est l'utilitaire intégré de Node.js. Le nœud 8 est utilisé.
Le code est encapsulé dans une fonction asynchrone. Sur la première ligne, la fonction de rappel «pool.getConnection» est convertie en promesses et appelée instantanément avec la déclaration supplémentaire «wait». Cela crée une séquence de la fonction asynchrone et renvoie une valeur (une connexion) à la place d'une fonction ou de promesses. La ligne suivante fait la même chose pour «conection.query», mais divise le code en deux instructions par souci de simplicité. Enfin, la fonction renvoie le résultat de la requête comme toute fonction synchrone.
Si vous avez un webpack / babel setup, vous pouvez utiliser babel-plugin-transform-util-promisify
. Il vous permet d'utiliser util.promisify
dans les versions de nœud <8. Également très utile si vous ciblez des versions de nœud> = 8 tout en maintenant la compatibilité avec les versions antérieures.
Le plugin transforme le code écrit dans les deux formats suivants:
const { promisify } = require('util');
et
import { promisify } from 'util';
Vous devez installer le plugin dans votre .babelrc
:
{
"plugins": [
"transform-util-promisify"
],
"presets": [
["env", {
"targets": {
"node": "current"
}
}]
]
}
Le plugin transforme import
et require
en une déclaration de fonction pour les versions de nœud <8. Il détecte automatiquement la version> = 8 et utilise le util.promisify
natif dans ces cas.
Partagez mon exemple de travail:
J'utilise ce Middleware MySQL promisifié pour Node.js
voici ma base de données.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
Vous devez mettre à niveau le noeud -v> 8.x
vous devez utiliser la fonction asynchrone pour pouvoir utiliser wait.
exemple:
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)
}
Voici une implémentation de 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)
);