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

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

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

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Express

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

Q&A

解決済

1回答

2623閲覧

Expressでクエリパラメータの値をPOST処理に引き継ぐ方法

maskmelon

総合スコア63

Node.js

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Express

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

0グッド

0クリップ

投稿2020/08/04 06:01

実現したいこと

データベースからランダムに2択の質問を取得

取得した質問と回答ボタンを表示

回答すると集計結果を表示

以上の機能をExpressを使って実現したいです。

該当するコード

JavaScript

1router.get('/question', async (req, res) => { 2//データベースからランダムに質問を取得 3 const fetchedQuestion = await fetchQuestion();  4//IDを文字列型に変換 5 const strId = fetchedQuestion._id.toString(); 6//個別の質問のページにリダイレクト 7 res.redirect(`/question/${strId}`); 8}); 9 10router.get('/question/:id', async (req, res) => { 11//クエリパラメータのIDから選択された質問を取得 12 const selectedQuestion = await Question.findById(req.params.id); 13//質問内容を表示するページをレンダリング 14 res.render('question', { question: selectedQuestion }); 15}); 16 17router.post('/question/:id', async (req, res) => { 18 console.log(req.params.id); //ここの中身が:idになってしまっている 19//回答数をインクリメントする処理 20 try { 21 if (req.body.countA) { 22 const selectedQuestion = await Question.findByIdAndUpdate(req.params.id, { $inc: { countA: 1 } }); 23 await req.user.answers.push({ questionId: selectedQuestion._id, answer: 'A' }); 24 await req.user.save(); 25 } 26 27 if (req.body.countB) { 28 const selectedQuestion = await Question.findByIdAndUpdate(req.params.id, { $inc: { countB: 1 } }); 29 await req.user.answers.push({ questionId: selectedQuestion._id, answer: 'B' }); 30 await req.user.save(); 31 } 32 33 } catch (e) { 34 console.log(e); 35 } 36 37

個別の質問を表示させるところまでは実装できているのですが(2番目のルーティングまで)、ポスト処理の際に:idの中身をうまく引き継ぐことができず、http://localhost:3000/question/:idにアクセスしてしまっている状態です。

具体的には、http://localhost:3000/question/5f28437758011a43922f8c41のようなURLに表示されている質問に回答すると、同じURLに対してPOSTできるようにしたいです。

ご教授いただけると嬉しいです。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

自己解決

hbs

1<form action="/question/{{selectedQuestion._id}}" method="post"> 2hogehoge 3</form>

テンプレートエンジンを使ってviewにidを渡すことで実現できました。

投稿2020/08/08 19:40

maskmelon

総合スコア63

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問