web-dev-qa-db-ja.com

MySQLで使用するnode.js async / await

すべての結果を同期して、c#のようなasync/awaitキーワードを含む文字列に追加する必要があります。

私はnode.jsを初めて使用するので、この新しい構文をコードに適合させることができません。

var string1 = '';
var string2 = '';
var string3 = '';
var string4 = '';

DatabasePool.getConnection(function(err, connection) {

        connection.query(query,function (err, result) {
            if (err){};
            string1 = result;
        });

        connection.query(query,function (err, result) {
            if (err){};
            string2 = result;
        });     

        connection.query(query,function (err, result) {
            if (err){};
            string3 = result;   
        });

        connection.query(query,function (err, result) {
            if (err){};
            string4 = result;
        }); 

       //I need to append all these strings to appended_text but  
       //all variables remain blank because below code runs first.
       var appended_text = string1 + string2 + string3 + string4;
});
15
Burc Hasergin

Node 8 +にいる場合、ノードmysqlでネイティブutil.promisify()を活用できます。

thisが混乱しないように、bind()で呼び出すことを忘れないでください。

const mysql = require('mysql'); // or use import if you use TS
const util = require('util');
const conn = mysql.createConnection({yourHOST/USER/PW/DB});

// node native promisify
const query = util.promisify(conn.query).bind(conn);

(async () => {
  try {
    const rows = await query('select count(*) as count from file_managed');
    console.log(rows);
  } finally {
    conn.end();
  }
})()
10
Leon li

Mysql2パケットを使用します。それはあなたがそれを行うことができるように約束ラッパーを持っています:

async function example1 () {
  const mysql = require('mysql2/promise');
  const conn = await mysql.createConnection({ database: test });
  let [rows, fields] = await conn.execute('select ?+? as sum', [2, 2]);
}
10
mr_squall

あなたがそれを使用しているあなたのORMがプロミスベースであると仮定すると、あなたはこのようなことをすることができます

async function buildString() {
  try {
    const connection = await DatabasePool.getConnection();
    const string1 = await connection.query(query);
    const string2 = await connection.query(query);
    const string3 = await connection.query(query);
    const string4 = await connection.query(query);

    return string1 + string2 + string3 + string4;
  } catch (err) {
    // do something
  }
}

呼び出しの前にawaitを置くことにより、すべてのpromiseをasync/awaitで使用できます。ただし、this関数はasync関数「ラッパー」内で使用する必要があることに注意してください。エラーはtry/catchブロックで処理する必要があります。

また、これら4つのクエリはnotが同時に実行されることも指摘しておきます。そのためにはPromise.allを使用する必要があります。

9
adam-beck

使用しているmysqlライブラリが、async/awaitで必要なPromiseをサポートしていること、または BluebirdのpromisifyAll などのツールを使用してライブラリをラップしていることを確認する必要があります。

async function appendedText() {
  const connection = await DatabasePool.getConnectionAsync();
  const [string1, string2, string3, string4] = await [
    connection.query(query1),
    connection.query(query2),
    connection.query(query3),
    connection.query(query4),
  ];
  return string1 + string2 + string3 + string4;
}

appendedText()を呼び出すと、実際には値ではなくPromiseが返されることに注意してください。

appendedText().then(appended_text => {});
1
Explosion Pills

mysqljs を使用しているようですが、これは約束されたベースのライブラリではありません。そのため、このライブラリを使用して希望どおりの結果を得ることができません。だからあなたができることは Sequelize のような約束されたベースのライブラリを使用するか、コメントが示唆するように:

ライブラリをラップするには、BluebirdのpromisifyAllなどのツールを使用します。

ラッピングについてはあまり詳しくないので、続編に切り替えることでした。

0
Pathum Kalhan

Mysql(mysqljsとも呼ばれます)を使用する場合、ラッパーを使用しない場合は少し作業を行う必要があります。しかし、それは十分に簡単です。接続関数は次のようになります。

const mysql = require('mysql')

var my_connection = mysql.createConnection({ ... })

async function connect()
{
    try
    {
        await new Promise((resolve, reject) => {
            my_connection.connect(err => {
                return err ? reject(err) : resolve()
            })
        })
    }
    catch(err)
    {
        ...handle errors...
    }
}

connect()

ご覧のとおり、awaitは約束の処理方法を知っています。そのようなものを作成し、コールバック実装で解決/拒否関数を使用します。これで全部ですので、データベースに頻繁にアクセスしない限り、ラッパーの使用は少し多いかもしれません。

0
Alexis Wilke