node.js:v9.5.0
MySQL:5.7.21
MacOS:10.12
見よう見まねでこういうコードを書きました。
javascript
1'use strict'; 2 3const mysql2 = require('mysql2/promise'); 4 5const pool = mysql2.createPool({ 6 host: 'localhost', 7 user: 'foo', 8 password: '', 9 database: 'test' 10}); 11 12const test = async () => { 13 const job = async () => { 14 const conn = await pool.getConnection(); 15 16 await conn.query('SELECT * FROM hoge_1', (err, rows, fields) => { 17 if (err) throw err; 18 console.log(rows); 19 }); 20 21 await conn.query('SELECT * FROM hoge_2', (err, rows, fields) => { 22 conn.release(); 23 if (err) throw err; 24 console.log(rows); 25 }); 26 }; 27 28 await job(); 29 await pool.end(); 30}; 31 32test();
やりたいことはnode.jsでMySQLを使ってデータを取得したいのですが、一つのプロセスでクエリを複数実行したいです。
async/awaitを使うことが条件となります。
期待していた結果は、job()内のawaitが上から順に実行されていき、クエリhoge_1、hoge_2の結果が落ちてくると思っていました。
ところがhoge_1の結果のみ返ってきて、pool.end()が効いていないせいか、処理を完了せず待機状態のままになってしまいます。
本当ならSQL文のWHERE以降の条件式に変数をもってきて、for文でループしたいのですが、うまくいかなくてバラバラにして試しています。
一度の処理でクエリを複数回すことは無理なのでしょうか?
追記:
ヒントを下さった皆様、ありがとうございました。
突然asyncモジュール禁止、async/awaitを使えと言われ、ドキュメントをきちんと把握せずに質問してしまい、申し訳ございませんでした。
ちょっとシンプルに変更した完成版のコードを貼っておきます。
javascript
1'use strict'; 2 3const mysql = require('mysql2/promise'); 4 5const pool = mysql.createPool({ 6 host: 'localhost', 7 user: 'foo', 8 password: '', 9 database: 'test' 10}); 11 12const test = async () => { 13 const conn = await pool.getConnection(); 14 15 const [rows_1, fields_1] = await conn.query('SELECT * FROM hoge_1'); 16 console.log(rows_1); 17 18 const [rows_2, fields_2] = await conn.query('SELECT * FROM hoge_2'); 19 console.log(rows_2); 20 21 const [rows_3, fields_3] = await conn.query('SELECT * FROM hoge_3'); 22 console.log(rows_3); 23 24 await pool.end(); 25} 26 27test();
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/03/20 15:41