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

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

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

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

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

Express

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

Q&A

1回答

501閲覧

クイズアプリで複数の回答を一度にPOSTしたい

izumeeeel

総合スコア11

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

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

Express

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

0グッド

1クリップ

投稿2018/12/25 14:01

編集2018/12/25 14:03

前提・実現したいこと

Express,Mongooseを用いて、簡単なクイズアプリを作っています。
複数の回答(2つ)をPOSTする機能を実装中に以下のエラーメッセージが発生しました。

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

Answer validation failed: number: Cast to Number failed for value "[ '1', '2' ]" at path "number"

該当のソースコード

pugを用いて、クイズおよび選択肢を表示させています。

pug

1form(method='POST' action='') 2 3 each question in question_list 4 li #{question.name} 5 | #{question.content} 6 div.form-group 7 label(for='number') 8 input#number.form-control(type='hidden', name='number' value=question.name) 9 label(for='answer_choice') 10 input#answer_choice.form-control(type="radio" name='answer_choice', value='1', required='true') 11 #{question.choice1} 12 input#answer_choice.form-control(type="radio" name='answer_choice', value='2', required='true') 13 #{question.choice2} 14 input#answer_choice.form-control(type="radio" name='answer_choice', value='3', required='true') 15 #{question.choice3} 16 input#answer_choice.form-control(type="radio" name='answer_choice', value='4', required='true') 17 #{question.choice4} 18 .submit 19 button.btn.btn-primary(type='submit') Submit 20

クイズの内容は以下のコードにてmLab(mongodb)にあがっています。現在はクイズは2問あります。

JavaScript

1var mongoose = require('mongoose'); 2 3var Schema = mongoose.Schema; 4 5var questionSchema = new Schema( 6 { 7 name: {type: Number, required: true}, 8 content: {type: String, required: true}, 9 choice1: {type: String, required: true}, 10 choice2: {type: String, required: true}, 11 choice3: {type: String, required: true}, 12 choice4: {type: String, required: true}, 13 } 14 15); 16 17//export model 18module.exports = mongoose.model('Question', questionSchema)

回答は以下のスキーマで管理しています。

JavaScript

1var mongoose = require('mongoose'); 2 3 4var Schema = mongoose.Schema; 5 6var AnswerSchema = new Schema( 7 { 8 number: {type: Number, required: true }, 9 answer_choice: {type: Number, required: true } 10} 11 12); 13 14 15//export model 16module.exports = mongoose.model('Answer', AnswerSchema) 17

回答のPOSTは以下のコードで行います。

JavaScript

1exports.answer_create_post = function(req, res, next) { 2 // Create an Answer object 3 var answer = new Answer( 4 { 5 number: req.body.number, 6 answer_choice: req.body.answer_choice 7 } 8 ); 9 answer.save(function (err){ 10 if (err) { return next(err); } 11 res.send('NOT IMPLEMENTED: Answer POST'); 12 }); 13 };

試したこと

8つ(4×2)のラジオボタンは一つしか押せないので、全てanswer_choiceとして認識されているのだと思うのですが、answer_choiceをqustion.nameに変えてしまうと以下のようなエラーが出てしまいます。

Answer validation failed: number: Cast to Number failed for value "[ '1', '2' ]" at path "number", answer_choice: Path `answer_choice` is required.

補足情報

プログラミングを始めたばかりで、基本的な知識が足りておらず、質問の仕方もいまいちわかっておりませんが、ご教示いただけると大変助かります。
なお、このアプリはMozillaのこちらのチュートリアルを参考にしております。
リンク内容

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

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

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

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

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

guest

回答1

0

エラーメッセージを確認すると、型変換で、配列を数字にしようとして、エラーが出てるようです。

error

1Answer validation failed: number: Cast to Number failed for value "[ '1', '2' ]" at path "number", answer_choice: Path `answer_choice` is required.

質問者さんの意図どおり、あたいは複数一気に取得できているようですが、そのあとの、値のsave部分でエラーが出てるように感じます。(どこのエラーか質問からわからず。。)

js

1var answer = new Answer( 2 { 3 number: req.body.number, 4 answer_choice: req.body.answer_choice 5 } 6 ); 7answer.save(function (err){ 8 if (err) { return next(err); } 9 res.send('NOT IMPLEMENTED: Answer POST'); 10 });

このAnswerクラスのanswer_choiceは数字のみを受け付けてるようなので、下記のようにして、バラバラに登録するか、もしくは、Answerクラスのanswer_choiceを修正する方向になると思います。

js

1var answer_choices = req.body.answer_choice; 2var LENGTH = answer_choices.length; 3for (var i = 0; i < LENGTH; i++) { 4 var answer_choice = answer_choices[i]; 5 var answer = new Answer( 6 { 7 number: req.body.number, 8 answer_choice: answer_choice 9 } 10 ); 11 answer.save(function (err){ 12 if (err) { return next(err); } 13 res.send('NOT IMPLEMENTED: Answer POST'); 14 }); 15}

投稿2019/01/07 10:28

yukiokamura

総合スコア18

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

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

izumeeeel

2019/01/10 11:19

ご丁寧に教えていただきありがとうございました!answer_choiceを修正したら二つとも取得することができました!上記のようにバラバラでやるほうもやってみたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問