web-dev-qa-db-de.com

NodeJs util.promisify ist keine Funktion

Ich versuche, eine MySQL-Funktion zu versprechen, aber wenn ich sie ausführe, zeigt die Konsole diesen Fehler util.Promisify is not a function. Das ist mein 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);
})

Der gleiche Fehler, wenn var query = util.promisify(mysql.query);

Ich programmiere neu, aber ich versuche zu lernen.

13
Eleazar Ortega

util.promisify ist Teil der Node 8.X-Version. Sie können jedoch noch eine Polyfill für die ältere Version von Node verwenden.

Für die ältere Version des Knotens .__ steht eine Polyfill zur Verfügung. Server, auf denen Sie Ihre Anwendung ausführen. Es kann über .__ installiert werden. npm auf folgende Weise:

npm install util.promisify

Jetzt können Sie das Modul utl mit älteren Versionen von Node patchen

const util = require('util');
require('util.promisify').shim();

const fs = require('fs');
const readFileAsync = util.promisify(fs.readFile);

Zitiert aus http://grizzlybit.info/2017/09/09/29/Node-JS-8-Util-Promisify/

19
zubair1024

Wenn Sie Node.js 8.x nicht verwenden, wird diese Funktion nicht definiert. Dies ist als sie hinzugefügt wurde zur Kernbibliothek Utilities.

Da util eine Kernbibliothek von Node.js ist , sollten Sie sie nicht installieren müssen. Wenn Sie Node.js 6.x verwenden, verwenden Sie eine Bibliothek wie Bluebird , die eine promisify - Funktion hat.

7
tadman

Util ist ab Node 8.x enthalten. Wenn Sie also den Knoten aktualisieren können, würde ich das tun.

4
Seph Cordovano

Sie können es selbst versprechen, wenn Sie möchten: const promisify = f => (...args) => new Promise((a,b)=>f(...args, (err, res) => err ? b(err) : a(res)));

3
Shl

Andere Leute haben mit der Lösung gesprochen, aber hier liegt eine weitere Quelle dieses Fehlers: 

Es gibt ein NPM-Paket es6-promisify, das auch die Fehlermeldung TypeError: promisify is not a function geben kann. (Deshalb bin ich auf diese Frage gekommen.)

  • Version 5.0.0 von es6-promisifiy benötigt const promisify = require("es6-promisify");, dann würden Sie result = promisify( ... ); verwenden

  • In Version 6.0.0 wurde die API geändert, und die Deklaration wurde in const { promisify } = require("es6-promisify"); geändert.

1
richb-hanover

Das folgende Beispiel sollte für Sie funktionieren:

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

In diesem Beispiel wird das Standard-MySQL-Modul für Node.js verwendet. Und das util.promisify ist das integrierte Dienstprogramm von Node.js. Knoten 8 wird verwendet.

Der Code wird in eine asynchrone Funktion eingeschlossen. In der ersten Zeile wird die Callback-Funktion "pool.getConnection" in Versprechen umgewandelt und sofort mit der zusätzlichen "waitit" -Anweisung aufgerufen. Dadurch wird eine Sequenz der asynchronen Funktion erstellt und ein Wert (eine Verbindung) anstelle einer Funktion oder eines Versprechens zurückgegeben. Die nächste Zeile macht dasselbe für die "conection.query", teilt den Code der Einfachheit halber jedoch in zwei Anweisungen auf. Schließlich liefert die Funktion das Ergebnis der Abfrage wie jede andere synchrone Funktion.

1
user2080851

Wenn Sie ein webpack / babel setup haben, können Sie babel-plugin-transform-util-promisify verwenden. Es ermöglicht die Verwendung von util.promisify in Knotenversionen <8. Auch sehr nützlich, wenn Sie auf Knotenversionen> = 8 abzielen, die Abwärtskompatibilität für niedrigere Versionen jedoch beibehalten möchten.

Das Plugin wandelt Code in den folgenden zwei Formaten um:

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

und

import { promisify } from 'util';

Sie müssten das Plugin in Ihrem .babelrc einrichten:

{
  "plugins": [
    "transform-util-promisify"
    ],
    "presets": [
      ["env", {
        "targets": {
          "node": "current"
        }
      }]
    ]
}

Das Plugin transformiert import und require in eine Funktionsdeklaration für Knotenversionen <8. Es erkennt automatisch Version> = 8 und verwendet in diesen Fällen den systemeigenen util.promisify.

0
Keyvan

Teilen Sie mein Arbeitsbeispiel:

Ich benutze diese Promisified MySQL-Middleware für Node.js

hier ist meine Datenbank.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

Sie müssen den Knoten -v> 8.x aktualisieren 

sie müssen die async-Funktion verwenden, um mit wait warten zu können.

beispiel:

   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

Hier ist eine Implementierung von 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