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

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

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

EJSは、JavaScript用のテンプレートエンジン。HTMLなどのテンプレートテキストにJavaScriptのロジックを記述することができます。また、変数・関数の実行をテンプレートテキスト内に埋め込むことも可能です。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Node.js

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

JavaScript

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

Q&A

0回答

346閲覧

【Node.js+EJS+SQLite3】異なるテーブルからデータを抜き出し、EJSに表示させたい。

uuchu

総合スコア0

EJS

EJSは、JavaScript用のテンプレートエンジン。HTMLなどのテンプレートテキストにJavaScriptのロジックを記述することができます。また、変数・関数の実行をテンプレートテキスト内に埋め込むことも可能です。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2023/03/11 05:34

初めて質問させていただきます。初学者のため、足りない情報などあるかと思いますので、その都度ご指摘いただければと思います。

実現したいこと

フォーム画面を作成したい。

  • プルダウンの中身をデータベースから引っ張って表示させたい。
  • 引っ張るテーブルはそれぞれ異なる。(2つ以上のテーブルから参照する
  • プルダウンの個数は2個以上

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

31| </select> 32| </div> >> 33| <% for(let i in check_data){ %> 34| <div class="mb-2"> 35| <label class="form-label" for="date"><%= check_data[i].item %></label> 36| <div class="form-check form-switch"> check_data is not defined

該当のソースコード

form.js

1var express = require('express'); 2var router = express.Router(); 3 4//load the sqlite 5const sqlite3 = require('sqlite3'); 6const db = new sqlite3.Database('./MEIS.db'); 7 8/* Join to User*/ 9router.get('/form', function(req, res,next) { 10 db.all("SELECT * FROM "+'"'+req.query.user+'"', (err, rows) =>{ 11 if (err) { 12 console.log("DBのユーザー情報に異常があります。"); 13 return; 14 } 15 let form_opt ={form_data:rows} 16 res.render('pages/form',form_opt); 17 }); 18 db.all("SELECT * FROM "+'"'+req.query.check+'"', (err, rows) =>{ 19 if (err) { 20 console.log("DBの点検項目に異常があります。"); 21 return; 22 } 23 let check_opt ={check_data:rows} 24 res.render('pages/form',check_opt); 25 }); 26}); 27 28module.exports = router;

form.ejs

1<%- include('../partials/head'); %> 2 <%- include('../partials/header'); %> 3 <main> 4 <div class="container"> 5 <form action="" method="post"> 6 <div class="mb-2"> 7 <label class="form-label" for="date">日時を選択してください。</label> 8 <input class="form-control" type="date" id="today"> 9 <script> 10 var date = new Date(); 11 var yyyy = date.getFullYear(); 12 var mm = ("0"+(date.getMonth()+1)).slice(-2); 13 var dd = ("0"+date.getDate()).slice(-2); 14 document.getElementById("today").value=yyyy+'-'+mm+'-'+dd; 15 </script> 16 </div> 17 <div class="mb-2"> 18 <label class="form-label" for="date">ユーザーを選択してください。</label> 19 <select class="form-select"> 20 <% for(let i in form_data){ %> 21 <option value="<%= form_data[i].id %>"><%=form_data[i].name%></option> 22 <%}%> 23 </select> 24 </div> 25 <% for(let i in check_data){ %> 26 <div class="mb-2"> 27 <label class="form-label" for="date"><%= check_data[i].item %></label> 28 <div class="form-check form-switch"> 29 <input class="form-check-input" type="checkbox" id="flexSwitchCheckDefault"> 30 <label class="form-check-label" for="flexSwitchCheckDefault">Default switch checkbox input</label> 31 </div> 32 </div> 33 <%}%> 34 </form> 35 </div> 36 </main> 37<%- include('../partials/footer'); %>

個人的に以下の箇所が問題であると考えています。

form.js

1router.get('/form', function(req, res,next) { 2 db.all("SELECT * FROM "+'"'+req.query.user+'"', (err, rows) =>{ 3 if (err) { 4 console.log("DBのユーザー情報に異常があります。"); 5 return; 6 } 7 let form_opt ={form_data:rows} 8 res.render('pages/form',form_opt); 9 }); 10 db.all("SELECT * FROM "+'"'+req.query.check+'"', (err, rows) =>{ 11 if (err) { 12 console.log("DBの点検項目に異常があります。"); 13 return; 14 } 15 let check_opt ={check_data:rows} 16 res.render('pages/form',check_opt); 17 }); 18});

試したこと

  • db.serializeでの同期化
  • form.ejsの記載ミスの確認。(片方を消して、動作を確認しましたが、片方ずつなら表示されます。

res.renderが2箇所記載されているのが問題でしょうか?db.allの外でできれば良いのですが、外で記述してしまうとそれもエラーになってしまい困っております・・・

補足情報(FW/ツールのバージョンなど)

  • Node.js : 18.12.1
  • EJS : 3.1.8
  • Express : 4.18.2
  • SQLite3 : 5.1.4

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

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

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

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

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

hoshi-takanori

2023/03/11 07:28 編集

Node.js の DB アクセスは非同期なので、コールバックで処理するなら最初のコールバックの中で次の DB アクセスを行う必要があります。 追加。これをコールバック地獄と言って、何が起きてるかはこの記事が参考になるかと。(今は promise よりも async/await を使うとすっきり書けそう…。) https://qiita.com/yusuke_ten/items/7cb87fed011cffbf2d4f
uuchu

2023/03/11 08:03

コメントありがとうございます!! 以下のような形で、良いのでしょうか?・・・ ```form.js router.get('/form', function(req, res,next) { db.all("SELECT * FROM "+'"'+req.query.user+'"', (err, rows) =>{ if (err) { console.log("DBのユーザー情報に異常があります。"); return; } let form_opt ={form_data:rows} res.render('pages/form',form_opt) db.all("SELECT * FROM "+'"'+req.query.check+'"', (err, rows) =>{ if (err) { console.log("DBの点検項目に異常があります。"); return; } let check_opt ={check_data:rows} res.render('pages/form',check_opt); }); }); }); ``` これでも、エラーになってしまいますね・・・ ``` 31| </select> 32| </div> >> 33| <% for(let i in check_data){ %> 34| <div class="mb-2"> 35| <label class="form-label" for="date"><%= check_data[i].item %></label> 36| <div class="form-check form-switch"> check_data is not defined ``` ```res.render```自体は、何度も書いて良いものなんでしょうか?
hoshi-takanori

2023/03/11 08:57 編集

res.render は最後に一回だけです。ってか、よく見たら SQL 文もやばいですね。入力値をチェックせずに文字列連結するのは SQL インジェクションの脆弱性です。しかもテーブル名が可変な時点で DB 設計も怪しい…。さらに、各 route で同じ DB をそれぞれ開いてそうですが、それって大丈夫でしたっけ?
uuchu

2023/03/13 01:14

やばいですか汗 それぞれ細かくご教授お願いしたいくらいです・・・が 学習におすすめの書籍などありますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問