質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2406閲覧

node.js MySQL -- 複数のテーブル情報を同一ページに表示させたい

uo1-yuyu

総合スコア1

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/06/09 10:14

前提・実現したいこと

※プログラミング学習を始めて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日悩んだ挙句、ここに質問させていただきました。

アドバイスをいただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

どちらかというとjavascriptにもう少し慣れたほうがいいと思います。私も勉強中です。

javascript

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});

これでview側のingredientsでデータ取れているのはわかっていると思います。

connection.queryを中で繰り返してコールバック地獄しましょう。asyncとかは今は忘れたほうがいいです。
最初はどう書いていたのかを理解してからpromise、async/awaitにいくのがいいと思います。

コールバックの変数名(error,results)は中で同一にするとバグるので気を付けて。

もちろん未検証です。要はconnection.queryでresultsをどんどん受け取っていきましょう。

javascript

1app.get('/ingredients', (req, res) => { 2 connection.query( 3 'SELECT*FROM ingredients', 4 (error_r, results_r) => { 5 if (error_r) throw error; 6 console.log(results_r); 7 // ここではまだingredientsしかない 8 //res.render('ingredients.ejs', {ingredients: results_r}); 9 10 // 次はingcategory 11 connection.query( 12 'SELECT*FROM ingcategory', 13 (error_c, results_c) => { 14 if (error_c) throw error; 15 console.log(results_c); 16 // 2つめ!result_rとresult_c両方使えますね! 17 res.render('ingredients.ejs', {ingredients: results_r,ingcategory: results_c}); 18 }); 19});

投稿2020/06/09 10:36

sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uo1-yuyu

2020/06/09 12:17

ありがとうございました!できました!!めちゃくちゃうれしいです。 ただまだまだなんでこうなるのかということが分かり切っていないので、勉強と実践で身に着けようと思います。 ありがとうございました<m(__)m>。
sousuke

2020/06/09 12:43

とりあえずおめでとうございます。ですがプログラミング学習を始めて3週間でnodeとmysqlというのは 正直言って学習素材としては敷居が高すぎると思います。 実際はrender先のejsを扱うとしてhtmlも理解する必要があり、デザイン要素のcss フロントエンドでフレームワークを使うならそれも理解する必要があります。 3週間でこのコードをいきなり見るのは無理だと思います。3週間はjavascriptで遊ぶべきだったと思います。javascriptに1週間触れていればこの問題は1時間で解けていたと思います。
uo1-yuyu

2020/06/09 12:52

アドバイスありがとうございます!正直何からやっていいかわからなかったので、HTMLとCSSを何とか理解したあと、仕事の管理で使えそうなシステムを作るということを目標に置き、わからない知識を集めながらやっているという状況です。とりあえず現時点ではJavascriptが大事というご指摘でしたのでこの勉強を進めようと思います。
sousuke

2020/06/09 13:11

今回はある程度答えさせていただきましたが、ここは1から言語を教わる場ではないので 「わかってないのですが適当にこうしてみました、動きませんわかりません!」というのはまずいと 思いますので、そのような質問にならないようにまた質問されるとよろしいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問