すべての結果を同期して、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;
});
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();
}
})()
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]);
}
あなたがそれを使用しているあなたの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を使用する必要があります。
使用している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 => {});
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は約束の処理方法を知っています。そのようなものを作成し、コールバック実装で解決/拒否関数を使用します。これで全部ですので、データベースに頻繁にアクセスしない限り、ラッパーの使用は少し多いかもしれません。