前提・実現したいこと
以下の構成を利用しています。
・node.js
・Express.js
・mysql
1段階目のSQLとして親データを取得(複数行取得される)
2段階目として取得した親データに対して、それぞれに紐づく子データを取得するSQLを実行し、データをJSONに加工してレスポンスに乗せて返却する。
発生している問題・エラーメッセージ
子データを取得するSQL実行が非同期実行となってしまい、親データだけの状態で返却されてしまう。
すべてのSQLが実行されたうえで、データを格納し返却したい。
該当のソースコード
node
1app.get('/getData', function(req,res) { 2 3 let resultData; 4 5 var data = req.body; 6 7 // 親データ取得SQL 8 let parentDataSql = "select bin_to_uuid(parent_id) as id, name, sort_no from parent"; 9 // 子データ取得SQL 10 let childDataSql = "select bin_to_uuid(child_id) as id, title from child where parent_id = uuid_to_bin(?)"; 11 12 con.query(parentDataSql, function(err, result, fields){ 13 if(err) throw err; 14 15 if(result.length > 0) { 16 resultData = result; 17 18 // parentで取得した行数分、childの取得を行う。 19 result.map((item) => { 20 // childDataSqlを実行 21 // ここが非同期処理となる 22 con.query(taskByStatus, item['parent_id'], async function(err, result, fields){ 23 if(err) throw err; 24 25 if(result.length > 0) { 26 item['items'] = result; 27 } else { 28 item['items'] = []; 29 } 30 }); 31 32 }); 33 // 子データ取得と、その結果をセットしてから返却したいが、con.query が非同期のため先に返却される 34 res.send(resultData); 35 36 } else { 37 resultData = ""; 38 return resultData; 39 } 40 }); 41});
試したこと
con.queryの箇所を配列にPushして、 res.sendの箇所を Promise.ALL()を使用してみたものの、子データ取得の処理を待つことはできませんでした。
(Promiseの理解度は高いとは言えないため、記述が間違っている可能性はあります)
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。