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

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

詳細はこちら
MySQL

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

Node.js

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

JavaScript

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

Express

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

Q&A

解決済

1回答

1789閲覧

Node.jsで検索結果を全て表示したいです(fetchAllができません)

jsrookie

総合スコア24

MySQL

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

Node.js

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

JavaScript

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

Express

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

0グッド

0クリップ

投稿2019/11/13 14:41

発生している問題

データベースには以下の様なデータを保存しています。

id name comment 1 カレー test1 2 シチュー test2 3 カレー test3

料理名(name)を検索をしてその結果を表示するようにしているのですが、「シチュー」の様に1つだけの場合は検索結果を表示することができるのですが、「カレー」の様に2つ以上ある場合に1つしか検索結果を表示することができません。
検索結果をすべて表示するためにfetchをfetchAllに変え、検索結果を表示する部分をforでループさせてみましたが上手くいきませんでした。
どうすれば検索結果を全て表示することができるでしょうか?

また、検索結果が0個(例えば「味噌汁」を検索)の場合にエンドレスに検索を続けてしまうためなのか検索が終わらずページが更新できない問題が出てしまいます。
可能であればそちらの解決方法もご教授頂けると幸いです。
よろしくお願いいたします。

該当のソースコード

<body> <div role="main"> <form method="post" action="/hello/add" name="test"> <div> <span>料理名:</span> <input type="text" name="name" value="<%= form.name %>"> </div> <div> </td><input type="submit" value="検索"> </div> </form> </div> <div> <% if (mydata != null){ %> <p><ul> <li><%- mydata.id %></li> <li><%- mydata.attributes.name %></li> <li><%- mydata.attributes.comment %></li> </ul></p> <% } %> </div> </body>
var express = require('express'); var router = express.Router(); var mysql = require("mysql"); var knex = require("knex")({ dialect: "mysql", connection: { host : "localhost", user : "root", password : "", database : "db", charset : "utf8" } }); var Bookshelf = require("bookshelf")(knex); var MyData = Bookshelf.Model.extend({ tableName: "mydata" }); //MySQLの設定情報 var mysql_setting = { host : "localhost", user : "root", password : "", database : "db" }; //ADD router.get("/add", (req, res, next) => { var data = { form: {name:""}, mydata: null, } res.render("hello/add", data); }); router.post('/add', (req, res, next) => { new MyData().where("name", "=", req.body.name).fetch().then((collection) => { var data = { form: req.body, mydata: collection, }; res.render("hello/add", data); }) }); module.exports = router;

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

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

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

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

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

guest

回答1

0

ベストアンサー

クエリを実行して複数の結果を返す場合、2層のオブジェクト化されているので、同じように記述してもだめですよ。

[ ["id":1,"name":"カレー","comment":"スープカレー"], ["id":3,"name":"カレー","comment":"スパイスカレー"] ]

なので、オブジェクトをループさせる処理がテンプレートか、スクリプト内で必要です。

投稿2019/11/22 02:51

FKM

総合スコア3647

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

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

jsrookie

2019/11/22 14:48

回答ありがとうございます。 >>なので、オブジェクトをループさせる処理がテンプレートか、スクリプト内で必要です。 ここの部分が分かりません。 ループ処理は ``` <% for (var i in content) { %> <p><ul> <li><%- content[i].id %></li> <li><%- content[i].attributes.name %></li> <li><%- content[i].attributes.comment %></li> </ul></p> <% } %> ``` ``` router.post('/add', (req, res, next) => { new MyData().where("name", "=", req.body.name).fetchAll({withRelated: ["user"]}).then((collection) => { var data = { form: req.body, mydata: collection, content: collection.toArray() }; res.render("hello/add", data); }) } ``` のようにしているのですが、こういうことではありませんですか?
FKM

2019/11/23 01:07 編集

まずはconsole.logで取得したdataの値を見てみてください。今のjsはconsole.logでオブジェクトの確認もできますので。 そのオブジェクトをejsテンプレートでループさせる際、for( key in objects )ではキーでないと正しく取得できない場合があるので、今回はインデックスなのでfor ( val of objects )の方がいいかも知れません。
jsrookie

2019/11/24 19:44

fetchAllではdataが見れなかったので、質問した際の最初のコード router.post('/add', (req, res, next) => { new MyData().where("name", "=", req.body.name).fetch().then((collection) => { var data = { form: req.body, mydata: collection, }; res.render("hello/add", data); }) }); でdataを見てみたところ { form: [Object: null prototype] { name: 'カレー', comment: 'test1', search: '検索' }, mydata: ModelBase { attributes: [Object: null prototype] { id: 1, name: 'カレー', comment: 'test1' }, _previousAttributes: { id: 1, name: 'カレー', comment: 'test1' }, changed: [Object: null prototype] {}, relations: {}, cid: 'c1', _knex: null, id: 1 } } となっていました。 現状はfetchAllで検索結果を表示するためにcontent: collection.toArray()で配列にし、for( var i in content )で配列を1つずつ表示しようとして失敗しているのだと思います。(勉強した本に書いてある通りにやっています) そこでfor ( val of objects )を試してみようとしたのですがvalとは何を入れればよいのでしょうか? また、今回確認したdataの値ではやっぱりfor ( val of objects )の方がいいんでしょうか? 長文失礼しました。
FKM

2019/11/25 09:27 編集

phpのforeachみたいなもので、for( val of objects)はオブジェクトに対して、インデックスを取得しないでも値を展開できるものです。console.logで取得したオブジェクトを見れば、json形式になっているはずですよ。そして、そのオブジェクト形式はfor( ary in arrays)は配列に対して取得するループ式なので、オブジェクトのプロパティ取得はできません
jsrookie

2019/11/26 06:50

FKMさんの回答を参考に試行錯誤した結果、無事検索結果をすべて表示することができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問