前提・実現したいこと
※プログラミング学習を始めて3週間程度なので質問内容が的を得ていなかったらご容赦ください。
・node.jsでmySQLに接続。
・任意のURLにアクセスした際に異なるテーブルを複数、同一ページに表示させたい。
最初にこう書いてみました
js
1app.get('/ingredients', (req, res) => { 2 connection.query( 3 'SELECT*FROM ingredients', 4 (error, results) => { 5 if (error) throw error; 6 console.log(results); 7 res.render('ingredients.ejs', {ingredients: results}); 8 }); 9}); 10 11app.get('/ingredients', (req, res) => { 12 connection.query( 13 'SELECT*FROM ingcategory', 14 (error, results) => { 15 if (error) throw error; 16 console.log(results); 17 res.render('ingredients.ejs', {ingcategory: results}); 18 }); 19}); 20 21app.get('/ingredients', (req, res) => { 22 connection.query( 23 'SELECT*FROM unit_code', 24 (error, results) => { 25 if (error) throw error; 26 console.log(results); 27 res.render('ingredients.ejs', {unit_code: results}); 28 }); 29});
/ingredients
にアクセスした際に、「ingredients」、「ingcategory」、「unit_code」の三つのテーブルを表示させたいと思っています。
ただこの結果、
ingcategory is not defined
とエラーメッセージが出ました。
これは「ingredients」テーブルを取得した時点でページを表示させているので、「ingcategory」「unit_code」の情報を取得していないためnot definedがでるのだろう。と理解しました。
そこでページを表示させる前に複数のクエリを実行できないかと調べた結果promiseとかasync/awaitを使わないといけないという情報にたどり着きました。ただまだまだ文章を読んで理解には至ることができず、似たような事例を応用してみることを試しました。
試したこと(コードを理解するまでには至っていませんが。。。)
js
1 2//$ npm install asyncでインストールしました。 3var async = require('async'); 4 5// getIngTablesを呼び出すことによって3つのテーブルの情報を取得したい 6let getIngTables = (callback) => { 7 var sql = 'SELECT * from ingredients'; 8 var sql2 = 'SELECT * FROM ingcategory'; 9 var sql3 = 'SELECT * FROM unit_code'; 10 11//みようみまねで書いてみたが、”callback”が必要なのかわからない。 12 async.parallel([ 13 (callback) => { connection.query(sql, callback) }, 14 (callback) => { connection.query(sql2, callback) } , 15 (callback) => { connection.query(sql3, callback) } 16 ], 17 ); 18}; 19 20//'/ingredients'をリクエストすると上記3つのテーブルの情報が表示されるようにしたい。 21app.get('/ingredients', (req, res) => { 22 getIngTables( (err, results) => { 23 if (err) 24 return res.send(err.message); 25//情報が取得できるか確認のためのconsole.logだが取得できていない 26 console.log(results); 27//’ingredients.ejs’に上記3つのテーブルの情報を渡したい。 28 res.render('/ingredients.ejs', getIngTables); 29 }); 30});
補足情報
promise、async、await、同期処理、非同期処理などのキーワードにぶち当たり色々調べましたが、結局理解に至っていません。
mysql2/asyncというモジュール(?)を使った似たような例や、こんな記事も検証しましたが、結局mysql2はインストールできても、”mysql2/async”なるものの使用方法がわからず、この方法は断念。
なんとかいろいろ探って上記のやり方に行き着くも、無間地獄にはまり3日悩んだ挙句、ここに質問させていただきました。
アドバイスをいただければ幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/09 12:17
2020/06/09 12:43
2020/06/09 12:52
2020/06/09 13:11