web-dev-qa-db-fra.com

NodeJs util.promisify n'est pas une fonction

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.

13
Eleazar Ortega

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/

19
zubair1024

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 .

7
tadman

Util est inclus à partir du nœud 8.x, donc si vous pouvez mettre à jour le nœud je le ferais.

4
Seph Cordovano

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

3
Shl

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

1
richb-hanover

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.

1
user2080851

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.

0
Keyvan

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

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

0
HMR