javascript - nodejs - util.promisify class




NodeJs util.promisifyは関数ではありません (6)

Node.js 8.xを使用しているのでない限り、この関数は定義されていません。 それがコアのUtilitiesライブラリに追加されたときです。

utilはNode.jsの中核となるライブラリなので、インストールする必要はありません。 Node.js 6.xを使用している場合は、 Bluebirdのようにpromisify機能を持つライブラリを使用してpromisify

私はそれを実行すると、mysql関数をpromisifyしようとしていますが、コンソールにこのエラーが表示されます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);場合も同じエラーですvar query = util.promisify(mysql.query);

私は新しいプログラミングですが、学ぼうとしています。


UtilはNode 8.x以降に含まれているので、あなたがノードを更新できるのであればそうします。


webpack / babel設定をしているなら、 babel-plugin-transform-util-promisify使うことができます。 それはあなたがノードのバージョン<8でutil.promisifyを使用することを可能にします。あなたがノードのバージョン> = 8をターゲットにしているが下位バージョンのために後方互換性を保ちたい場合にも非常に役に立ちます。

このプラグインは、次の2つの形式で書かれたコードを変換します。

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

そして

import { promisify } from 'util';

あなたの.babelrcプラグインを設定する必要があります。

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

プラグインはimport 、ノードのバージョン<8に対する関数宣言requireします。これはバージョン> = 8を自動的に検出し、そのような場合にはネイティブのutil.promisifyを使用します。


あなたが望むなら、あなた自身でそれを約束することができますconst promisify = f => (...args) => new Promise((a,b)=>f(...args, (err, res) => err ? b(err) : a(res)));


他の人々が解決策について話していますが、これがこのエラーの別の原因です。

TypeError: promisify is not a functionというエラーメッセージもes6-promisifyれる可能es6-promisifyのある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");


次の例はあなたにとってうまくいくはずです。

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

この例では、Node.jsに標準のMySQLモジュールを使用しています。 そしてutil.promisifyはNode.jsの組み込みユーティリティです。 ノード8が使用されます。

コードは非同期関数にラップされています。 その中の最初の行のコールバック関数 'pool.getConnection'はプロミスに変換され、追加の 'await'ステートメントで即座に呼び出されます。 これはasync関数のシーケンスを作成し、関数や約束の代わりに値(接続)を返します。 次の行は、 'conection.query'についても同じですが、単純にするためにコードを2つのステートメントに分割しています。 最後に、この関数は他の同期関数と同じようにクエリの結果を返します。





node.js