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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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

解決済

2回答

4294閲覧

Node.jsでクエリ実行すると「undefined」と表示されます。

tanitanitani

総合スコア4

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/11/20 12:44

Node.jsでクエリ実行した結果の配列をターミナルに表示させたい。

Node.jsからクエリ実行すると、ターミナルに「undefined」が表示されます。

発生している問題・エラーメッセージ

undefined

app.js

js

1 2//パッケージ読み込み 3const express = require('express'); 4const app = express(); 5 6const mysql = require('mysql'); 7 8// CSSや画像ファイルを置くフォルダを指定 9app.use(express.static('public')); 10 11// mysqlの接続情報 12const connection = mysql.createConnection({ 13 host: 'localhost', 14 user: 'roof', 15 password: '*****', 16 database: 'list_app' 17}); 18 19//HTTPリクエストを受け取る部分 20app.get('/index', (req, res) => { 21 connection.query('SELECT * FROM users', 22 (error,results) => { 23 console.log(results); 24 res.render('index.ejs'); 25 }); 26}); 27 28 29// サーバーを起動するコード 30app.listen(3000); 31

mysql

1mysql> show databases; 2+--------------------+ 3| Database | 4+--------------------+ 5| information_schema | 6| list_app | 7| mysql | 8| performance_schema | 9| sys | 10+--------------------+ 115 rows in set (0.00 sec) 12 13mysql> use list_app; 14Reading table information for completion of table and column names 15You can turn off this feature to get a quicker startup with -A 16 17Database changed 18mysql> show tables; 19+--------------------+ 20| Tables_in_list_app | 21+--------------------+ 22| users | 23+--------------------+ 241 row in set (0.00 sec) 25 26mysql> show columns from users; 27+-------+---------+------+-----+---------+----------------+ 28| Field | Type | Null | Key | Default | Extra | 29+-------+---------+------+-----+---------+----------------+ 30| id | int(11) | NO | PRI | NULL | auto_increment | 31| name | text | YES | | NULL | | 32+-------+---------+------+-----+---------+----------------+ 332 rows in set (0.00 sec) 34 35mysql> select * from users; 36+----+-----------------+ 37| id | name | 38+----+-----------------+ 39| 1 | じゃがいも | 40| 2 | じゃがい | 41| 3 | じゃが | 42+----+-----------------+ 433 rows in set (0.00 sec) 44 45mysql> 46

##試したこと

このように⇩jsファイルからejsファイルに値を渡してみました。

js

1app.get('/index', (req, res) => { 2 connection.query( 3 'SELECT * FROM users', 4 (error, results) => { 5 res.render('index.ejs',{users:results}); 6 } 7 ); 8});

ejs

1<ul class="main-input"> 2 <% users.forEach((item) => { %> 3 <li> 4 <div class="item-data"> 5 <span class="id"><%= item.id %></span> 6 <span class="textarea"><%= item.name %></span> 7 </div> 8 </li> 9 <% }); %> 10</ul>

そうすると、ターミナルに下記のエラーが表示されます。

TypeError: /Users/tanimurashun/Desktop/list-app/views/index.ejs:29 27| <!--ここまで=============--> 28| <ul class="main-input"> >> 29| <% users.forEach((item) => { %> 30| <li> 31| <div class="item-data"> 32| <span class="id"><%= item.id %></span> Cannot read property 'forEach' of undefined

どなたかご教授くれる方はいないでしょうか?すぐ返信致します。また解決ができ次第、私からも回答致します。よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

js

1const connection = mysql.createConnection({ 2 host: 'localhost', 3 user: 'roof', 4 password: '*****', 5 database: 'list_app' 6});

超ヤマカンですが、それMySQLサーバに接続出来てないんじゃないですか?
だって、ユーザー名rootじゃなくてroofになってますよ。


JavaScriptはnullundefinedはプロパティを持てず、
値.プロパティ名という風にドットプロパティ名でアクセスを試みた時点でエラーで落ちます。
これが今回の動かない主原因となります。

じゃあなんでresultsundefinedになるねん。
MySQLからの結果なら普通配列になるからforEachプロパティ(メソッド)持ってるはずやろ?となります。

よしんば結果が0件だとしてもnullはあり得てもundefinedはおかしい。
恐らくSQL文の発行に失敗しているのでしょう。

原因を突き止める為に、
まずコールバック関数内でerrorの引数に何か入ってないかを確認すべきです。

js

1 (error,results) => { 2 console.log(error); // これを足す 3 console.log(results); 4 res.render('index.ejs'); 5 });

ざっと質問文の流れを追ってみてもSQLやテーブルの情報がおかしいようには思えないですし……
というわけで遡って調べていくとMySQL実行時のユーザー名にTypoしているらしき跡を見つけました。

投稿2020/11/20 13:28

miyabi-sun

総合スコア21158

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

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

tanitanitani

2020/11/20 13:35

roofが原因でした。こんなにあっけなかったなんて…泣 本当にありがとうございます!助かりました。orz
guest

0

user: 'roof',

mysqlのユーザ名は「roof」なのですか?

投稿2020/11/20 13:38

technocore

総合スコア7200

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

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

tanitanitani

2020/11/20 13:52

「 root 」でした泣 回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問