🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Node.js

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

JavaScript

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

2233閲覧

Node.jsでMySQLのデータを取得する際、リロードしないと読み込まれない

l_h_l_h

総合スコア22

Node.js

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

JavaScript

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2019/11/11 10:57

Node.js(EXPRESS)で、MySQLにINSERT、SELECTできるコードを書きました。
トップページでテーブルのデータを表示、insertページではフォーム送信後にトップページにリダイレクトするようにしました
しかし、毎回リロードを挟まないと、起動時には何も表示されない、insert後は新しいデータが表示されないという感じになってしまいました
nodeを触るのは今日が初めてで色々調べまくってようやく動いたという感じなのでおそらくコードが変なのだと思いますが、やっとDBに接続できたというレベルなので解決できません……

index.js

js

1var express = require('express'); 2var router = express.Router(); 3 4var mysql = require('mysql'); 5const mysql_setting = { 6 host : 'localhost', 7 user : '***', 8 password : '***', 9 database : '***' 10}; 11 12var posts = []; 13 14 15 16/* GET home page. */ 17router.get('/', function(req, res, next) { 18 const connection = mysql.createConnection(mysql_setting); 19 connection.connect(); 20 connection.query('select * from user', function (error, results, fields) { 21 if (error) throw error; 22 posts = results; 23 // posts.forEach(element => { 24 // console.log('name: ' + element.name); 25 // console.log('id: ' + element.id); 26 // }); 27 }); 28 res.render('index', { title: 'Express' , posts: posts}); 29 connection.end(); 30}); 31 32router.get('/add', function (req, res, next) { 33 const data = { 34 errorMessage: '' 35 } 36 res.render('add',data); 37}); 38 39 40router.post('/add', function(req, res, next) { 41 //var id,name; 42 var result = { 43 id: req.body.id , 44 name:req.body.name 45 }; 46// res.render('', result); 47 const connection = mysql.createConnection(mysql_setting); 48 connection.connect(); 49 const query = 'insert into user set ?'; 50 connection.query(query, result,function (error, results, fields) { 51 if (error) throw error; 52// console.log("1 recoad inserted"+result.id); 53 res.redirect('/'); 54 }); 55}); 56//module.exports.formInsert = (id, name) => formInsert(id,name); 57module.exports = router; 58

index.jade

jade

1extends layout 2 3block content 4 h1= title 5 p Welcome to #{title} 6 a(href='/add') add 7 for post in posts 8 <p>title: #{post.id}</p> 9 <p>content: #{post.name}</p> 10 endfor 11

add.jade

jade

1form(action="/add",method="POST") 2 input(type="text", name="id" value="") 3 input(type="text", name="name" value="") 4 input(type="hidden", name="mode" value="input") 5 input(type="submit", value="送信") 6

詳しい方、よろしくお願いいたします

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

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

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

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

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

guest

回答1

0

ベストアンサー

javascript

1/* GET home page. */ 2router.get('/', function(req, res, next) { 3 const connection = mysql.createConnection(mysql_setting); 4 connection.connect(); 5 connection.query('select * from user', function (error, results, fields) { 6 if (error) throw error; 7 posts = results; 8 console.log('First?'); // ★ 9 // posts.forEach(element => { 10 // console.log('name: ' + element.name); 11 // console.log('id: ' + element.id); 12 // }); 13 }); 14 console.log('Second?'); // ★ 15 res.render('index', { title: 'Express' , posts: posts}); 16 connection.end(); 17});

★印の二行を追加してみてください。
コードを見る限りだと First? → Second? の順番で実行されることを期待しているようですが、本当にそうなるかどうかを確認してみてください。

ちなみに、connection.query() の引数の function(...){...} のことをコールバック関数(もしくは単にコールバック)と言います。
もしコールバックのことを知らなければ調べてみてください。

投稿2019/11/11 12:50

2KOH

総合スコア999

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

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

l_h_l_h

2019/11/13 15:45 編集

回答ありがとうございます どうやらSQLの実行の方が後に行われるようです 実は質問後も実装を続けていて、他の処理のところで同様の事象が発生して困っていたのですが、そちらはasyncを使って解決できました(したがってこの問題も非同期処理で解決できるはずです) ですが、他に何か良い方法などありますでしょうか
2KOH

2019/11/13 03:36

async を正しく理解して使いこなすのは、Node.js を始めて数日の初心者には少し難しいかもしれません。 今回の場合だと、async を使うほどではなく、単純に Second? の下の二行を First? の部分に移動すれば解決すると思います。 async とは、非同期処理の際に、コードを読みやすくするための常套手段です。 例えば、コールバックが何重にも入れ子になって煩雑だとか、今回のように上に書いたコードが下に書いたコードより後に実行されて直感的でないとか、そういうときにコードを読みやすくするために使う手法です。 コードを読みやすくするための手段に過ぎないので、async を使っている箇所は当然 async を使わなくても書けます。 「async を使うことでスッキリしたコードが書けた」は正しいですが、もしも「async を使うことでバグを解消できた」と思っているなら、async について勘違いしている可能性があるので、見直しておいてください。
l_h_l_h

2019/11/13 15:50

詳しくありがとうございます そのような話は個人でやっていくと中々知れないため助かります 少し話がそれてしまうのですが、今回他で困った箇所は、 ①SELECT文で得た結果を他のクエリ(のWHEREの部分)でも使用したい ②SQL文の実行が後になるため、式評価の時点でエラーになる という感じでした これをasyncを使うことで実行順通りに並べて解決したのですが、確かに入れ子にしていけばそれでも十分そうです このようなケースなら入れ子にしていくよりasyncを使ったほうが直感的に読みやすい気もするのですが、いかがでしょう 書き直すべきでしょうか もしよろしければお返事いただければ幸いです
2KOH

2019/11/14 02:03

実際のコードを見ない限り「入れ子になるなら async を使うほうがいい」という原則論しか言えません。 それに、そういうのは他人に聞くより、実際に自分で二通りのやり方で書いてみて見比べる方がいいと思います。 もし二通りのやり方で書く過程で調べてもわからないことがあれば質問をすればいいですが、この質問の本題からは完全に外れているので、別の質問を立てて行ってください。 また、正しく動作するコードが完成しているなら、この件は一旦ここまでにしておいて次に着手する方がいいかもしれません。 コードはできるだけ保守しやすいわかりやすい状態にしておくべきですが、かと言ってあまりに長時間一つのコードとにらめっこするのも良くないので。 ただ、それこそあなたが何の目的でこのプログラムを作っているかがわかりませんし、そもそもプログラミングの質問から外れていてこのサイトにそぐわない内容なので、どちらがいいかなんて答えられませんが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問