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

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

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

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

JavaScript

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

Express

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

Q&A

解決済

1回答

931閲覧

node.jsでテーブル結合後の扱い方

tuna-kan

総合スコア23

Node.js

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

JavaScript

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

Express

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

0グッド

0クリップ

投稿2021/07/13 06:03

編集2021/07/14 01:45

ヘディングのテキスト### 前提・実現したいこと

Expressのapp.getでテーブルを結合した後にapp.postでのクエリの適切な処理

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

発生している問題

SNSを作っています。
トップページでのapp.getでトップページに表示する投稿のpostテーブルとicon情報を格納しているusersテーブルの結合後にapp.postの処理が適切にされないためかいいねや投稿の削除ができません。
初めて三ヶ月も経っていない若輩者で理解力が足りていませんが助言の方よろしくお願いします。

node

1### 該当のソースコード 2app.get('/',(req,res)=>{ 3 connection.query( //usersとpostを結合しusersに保存しているiconを取得 4 'SELECT * FROM post JOIN users ON post.user_id=users.id ORDER BY post.id DESC', //昇降順をpostのidの降順に 5 (error,results)=>{ 6 res.render('top.ejs',{post:results,errors:[]}); //投稿をトップページに表示 7 } 8 ); 9 }); 10 11 app.post('/',(req,res)=>{ 12 const text=req.body.text; //req.bodyに保存されいている投稿内容を変数textに 13 const user_id=req.session.userId; //セッションにあるuserIdをDBに記録 14 const username=req.session.username; //ユーザーネーム 15 const favo_id=req.body.favoid; //投稿のid 16 const del_id=req.body.del; 17 const errors=[]; 18 var today = new Date(); //日時取得 19 const todays =today.getFullYear() + "-" + (today.getMonth()+1) + "-"+ today.getDate() + "-" + today.getHours() + "-" + today.getMinutes(); 20 const imgUrl=req.body.img; //入力フォームの画像を代入 21 22 23 connection.query( //投稿処理 24 'INSERT INTO post(text,user_id,date,username,img) VALUES(?,?,?,?,?)', 25 [text,user_id,todays,username,imgUrl], 26 (error, results) => { 27 res.redirect('/'); 28 } 29 ); //これは適切に処理されています 30 31 connection.query( //投稿へのいいね+1後に、いいねをしたユーザーのいいね付与数を増やす 32 'UPDATE post SET favo=favo+1 WHERE id=?', //取得した投稿のidを探しいいね+1処理 33 [favo_id], 34 (error_p,results_p)=>{ 35 connection.query( 36 'UPDATE users SET give_like = give_like+1 WHERE id=?', //いいねしたユーザーの付与数+1 37              //ここをusers.give_likeなどにしても適切に動きません 38 [user_id], 39 (error_f,results_f)=>{ 40 }); 41 }); 42 43 44 connection.query( //投稿idを取得し削除 45       //この記述では動きません 46 'DELETE FROM post WHERE post.id=?', 47 [del_id], 48 (error_d,results_d)=>{ 49 50 } 51 ); 52 }); 53 54 55

html

1<div class="post-wrapper"> 2 <%post.forEach((posted)=>{%> 3 4 <div class="post"> 5 <img class="icon" src="<%=posted.icon%>"> 6 <a href=""><%=posted.username%></a> <!--投稿者--> 7 <p class="post-info">|  <%=posted.date%> <span class="like"><form action="/" method="post" id="like-form"><%=posted.favo%></span> <button type="submit" name="favoid" value="<%=posted.id%>" id="favo-submit"><i class="fas fa-hands"></i></button></form> 8 9 <%if(posted.user_id ===locals.userId){%> 10 <form action="/" method="post" id="del"> 11 <button type="submit" name="del" value="<%=posted.id%>">delete</button> 12 </form> 13 <%}%></p> <!--投稿日表示--> 14 15 16 <div class="content"> 17 <p><%=posted.text%></p> <!--投稿内容--> 18 </div> 19 <%if(posted.img===""){%> <!--画像のアドレスを入力しimgタグで表示--> 20 21 <%}else{%> 22 <img class="content-img" src="<%=posted.img%>" alt=""> 23 <%}%> 24 </div> 25 <%})%> 26 </div> 27

usersTABLE

1 # 名前 タイプ 照合順序 属性 NULL デフォルト値 コメント 2 1 id 主 int(11)      いいえ なし AUTO_INCREMENT 3 4 2 username varchar(15) utf8mb4_general_ci いいえ なし 5 3 email varchar(30) utf8mb4_general_ci いいえ なし 6 4 password char(50) utf8mb4_general_ci いいえ なし 7 5 give_like int(10)     いいえ 0 8 6 have_like int(10)    いいえ なし 9 7 icon char(150) utf8mb4_general_ci いいえ /images/adminster.jpg 10 11 12

postTABLE

1 # 名前 タイプ 照合順序 属性 NULL デフォルト値 コメント 2 1 id 主 int(11)      いいえ なし AUTO_INCREMENT 3 2 text varchar(100)utf8mb4_general_ci はい NULL 4 3 favo int(10)       いいえ  0 5 4 user_id int(11)    いいえ なし 6 5 date char(20) utf8mb4_general_ciいいえ なし 7 6 username varchar(15) utf8mb4_general_ci いいえ なし 8 7 img varchar(1000) utf8mb4_general_ci いいえ なし 9

試したこと

結合をやめた場合は正常にいいねや削除の処理ができるため、テーブル結合後のクエリの扱いへの理解が足りていないようです。(ORDER BYで結合しサイト上で表示されているデータを取得するexpressの記述法)

HTMLで削除の処理の記述で取得したpos.idの代わりに整数の値をnode.jsに渡し直接クエリの削除を試みましたが処理されませんでした。
やはりクエリの処理がおかしいようです。

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

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

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

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

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

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

odataiki

2021/07/13 15:15

post テーブルと users テーブルのテーブル構造は提供可能ですか? HTMLにセットした id の値 が質問者さんの意図した値になっていないのではと想像しています。 提供が難しい場合はデバッグして HTML側に意図した値がセットされているか確認するのも 解決への道です。
guest

回答1

0

自己解決

自己解決しました。
どうやらpostテーブルとusersテーブルの両方にidカラムがあったことが原因のようです。
console.logで結合後のSQLを見てみるとpostのidがなくusersのidしか表示されていませんでした。

他にもっとスマートなやり方があると思いますが私はpostのidカラムをpost_idとusersのidと分けることで正常に処理されました。
ありがとうございました。

投稿2021/07/14 02:00

tuna-kan

総合スコア23

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

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

tuna-kan

2021/10/30 11:56

追記ですが、普通にSQLの時点でidを変更すれば動くと思います。 変更前 'SELECT * FROM post JOIN users ON post.user_id=users.id ORDER BY post.id DESC' 変更後 'SELECT *,post.id AS post_id FROM post JOIN users ON post.user_id=users.id ORDER BY post.id DESC'
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問