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

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

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

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

Node.js

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

5957閲覧

node.js,mysqlでルーティングの中で複数のクエリ を実行する方法

yoshida_2571

総合スコア1

MySQL

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

Node.js

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

1クリップ

投稿2020/05/16 04:23

前提・実現したいこと

プログラミング超初心者です。progateにてインプットしたことを応用してアウトプットしたく、
node.js、mysqlを使い、家計簿アプリを作ろうとしております.

mysqlのデータを呼び込み、データの一覧と合計値を一つのページに出したいです。

app.jp

const express = require('express'); const mysql = require('mysql'); const app = express(); app.use(express.static('public')); app.use(express.urlencoded({extended: false})); const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: '-------', database: 'list_app' }); app.get('/', (req, res) => { res.render('hello.ejs'); }); app.get('/index',(req, res) => { connection.query( 'select * from users', (error,results) => { console.log(results); res.render('index.ejs',{users: results}); } ) }); app.listen(3000);

index.ejs

<!DOCTYPE html> <html lang="jpn" dir="ltr"> <head> <meta charset="utf-8"> <title>家計情報アプリ</title> <link rel="stylesheet" href="/css/style.css"> </head> <body> <div class="index-header"> <a href="/">家計簿アプリ</a> </div> <div class="index"> <div class="index-title"> <h2>収支一覧</h2> <a class="new-button" href="#" >+ 新規登録</a> </div> <div class="index-table-wrapper"> <div class="table-head"> <span class="date-column">日付</span> <span class="name-column">項目</span> <span class="money-column">金額</span> </div> <ul class="table-body"> <% users.forEach((item) => { %> <li> <div class="item-data"> <span class="date-column"><%= item.date %></span> <span class="name-column"><%= item.name %></span> <span class="money-column"><%= item.money %></span> </div> <div class="item-menu"> <form action="/delete/<%= item.id %>" method="post"> <input type="submit" value="削除"> </form> <a href="# <%= item.id %>">編集</a> </div> </li> <% }); %> </ul> <div class="sum"> <h3>合計</h3> </div> </div> </div> </body> </html>

試したこと

const sumMoney = function(){connection.query(
'select sum(money) from users',
(error,results) => {
console.log(results);
res.render({sums:results});
});};

上記で関数にしてしまって、app.get('/index',(req, res) => の中に入れ込んだり、
いろいろ試しましたが上手くいかず、一つのルーティングの中で複数のクエリを実行してビューファイルに渡すことができませんでした。
いいj方法があればご教授いただきたいです。。。

”合計”の右側に出したいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

公式ドキュメントに Multiple statement queries についての説明があります。
こちらの方法でご要望は満たせないでしょうか?

投稿2020/05/16 05:59

snogot

総合スコア134

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

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

yoshida_2571

2020/05/16 11:37

回答いただきありがとうございます。また返信遅くなりまして、申し訳ありません。 ご教授いただいた内容を記述すると app.get('/index',(req, res) => { connection.query( 'select * from users ; select sum(money) from users', (error, results) => { console.log(results[0]); // [{1: 1}] console.log(results[1]); // [{2: 2}] res.render('index.ejs', {users: results[0],sums: results[1]}); } ); }); こういうことでしょうか? エラーになってしまうのですが、違う書き方になるのでしょうか?
snogot

2020/05/16 11:49

ご提示のコードを見る限りでは問題なさそうに見えますが、 エラーというのは具体的に、どのような内容でしたか? また、エラー内容から不具合のある箇所を推測することは難しいでしょうか?
yoshida_2571

2020/05/16 12:04 編集

申し訳ありません、皆目見当がつかず、、、 app.get('/index',(req, res) => { connection.query( 'select * from users', (error, results) => { console.log(results); res.render('index.ejs',{users :results}); } ); }); このコードであれば、合計値は出ませんが、エラーは出ずきちんと出力されます。 ターミナルに出てきているエラーは下記になります。 [nodemon] restarting due to changes... [nodemon] starting `node app.js` /Users/ーーーーーーー/node_modules/mysql/lib/protocol/Parser.js:437 throw err; // Rethrow non-MySQL errors ^ Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the r ight syntax to use near 'select sum(money) from users' at line 1 at Query.Sequence._packetToError (/Users/ーーーー ー/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14) at Query.ErrorPacket (/Users/ーーーーーーーー/node_modules/mysql/lib/protocol/sequences/Query.js:79:18) at Protocol._parsePacket (/Users/ーーーーーーーー/node_modules/mysql/lib/protocol/Protocol.js:291:23) at Parser._parsePacket (/Users/ーーーーーーーー/node_modules/mysql/lib/protocol/Parser.js:433:10) at Parser.write (/Users/ーーーーーーーー/node_modules/mysql/lib/protocol/Parser.js:43:10) at Protocol.write (/Users/ーーーーーーーー/node_modules/mysql/lib/protocol/Protocol.js:38:16) at Socket.<anonymous> (/Users/ーーーーーーーー/node_modules/mysql/lib/Connection.js:88:28) at Socket.<anonymous> (/Users/ーーーーーーーー/node_modules/mysql/lib/Connection.js:526:10) at Socket.emit (events.js:315:20) at addChunk (_stream_readable.js:302:12) -------------------- at Protocol._enqueue (/Users/ーーーーーーーー/node_modules/mysql/lib/protocol/Protocol.js:144:48) at Connection.query (/Users/ーーーーーーーー/node_modules/mysql/lib/Connection.js:198:25) at /Users/ーーーーーーーー/Documents/list-app/app.js:19:14 at Layer.handle [as handle_request] (/Users/ーーーーーーーー/Documents/list-app/node_modules/express/lib/router/layer.js:95:5) at next (/Users/ーーーーーーーー/Documents/list-app/node_modules/express/lib/router/route.js:137:13) at Route.dispatch (/Users/ーーーーーーーー/Documents/list-app/node_modules/express/lib/router/route.js:112:3) at Layer.handle [as handle_request] (/Users/ーーーーーーーー/Documents/list-app/node_modules/express/lib/router/layer.js:95:5) at /Users/ーーーーーーーー/Documents/list-app/node_modules/express/lib/router/index.js:281:22 at Function.process_params (/Users/ーーーーーーーー/Documents/list-app/node_modules/express/lib/router/index.js:335:12) at next (/Users/ーーーーーーーー/Documents/list-app/node_modules/express/lib/router/index.js:275:10) { code: 'ER_PARSE_ERROR', errno: 1064, sqlMessage: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syn tax to use near 'select sum(money) from users' at line 1", sqlState: '42000', index: 0, sql: 'select * from users; select sum(money) from users' } [nodemon] app crashed - waiting for file changes before starting... ※私のPCのユーザー名のみ”ーーーーーーーー”に変更しております。
yoshida_2571

2020/05/16 12:49

度々申し訳ありません。 いろいろ試行錯誤しながらやっていたところ、 const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'ーーーーーー', database: 'list_app', }); 上記に” multipleStatements: true”を追加したら、console.logでエラーが出なくなりました! ですが、 app.get('/index',(req, res) => { connection.query( 'select * from users; select sum(money) from users', (error, results, fields) => { if (error) throw error; console.log(results[0]); console.log(results[1]); res.render('index.ejs',{users :results[0],sums :results[1]}); } ); }); 上記のsumsのデータをビュー側で受け取ろうとした際に、 <div class="sum"> <h3>合計</h3> <% sums.forEach((item) => { %> <h3><%= item.'sum(money)' %></h3> <% }); %> </div> これで受け取ろうとしたのですが、上手く合計値をブラウザに表示することができません。 別の書き方になるのでしょうか? お手数おかけし本当に申し訳ありません。。。
snogot

2020/05/16 13:37

エラーの件、自己解決できてなによりです。 ビュー側の処理ですが、角括弧を使い <h3><%= item['sum(money)'] %></h3> とすればいかがでしょうか? もしくは、select時に sum(money) に英字のみの別名を付けておけば、ドットでもアクセス可能かと思います。
yoshida_2571

2020/05/16 14:26

正しく表示できました!! 丁寧にご教授いただき大変助かりました。 ありがとうございます!!!
snogot

2020/05/16 14:51

お疲れさまでした。 正しく表示できたとのことで、安心しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問