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

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

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

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

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1840閲覧

mongoose castError とは

hiro_ike

総合スコア48

MongoDB

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

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/06/26 02:42

編集2021/06/26 08:50

JavaScript/mongoDB初心者です。

クエリ情報を更新しようとすると下記エラーとなります。
{"msg":"Cast to Boolean failed for value "on" (type string) at path "shipIsBroken""}

shipIsBrokenはBooleanを指定しているつもりですが、
エラーとなる原因が分かりませんでした。
このエラーは、どういった時に出るものでしょうか、
または、確認すべき場所をご指摘いただけますと幸いです。

JavaScript

1const { Schema, model } = require('mongoose'); 2const logSchema = new Schema({ 3 title: { type: String, required: true, unique: true }, 4 entry: { type: String, required: true ,unique: true }, 5 shipIsBroken: { type: Boolean, required: true }, 6}); 7 8 9const Log = model('Log', logSchema); 10module.exports = Log; 11

JavaScript

1equire('dotenv').config() 2const express = require('express'); 3const app = express(); 4const PORT = process.env.PORT || 3000; 5const Log = require('./models/logs') 6/******* 7Database Setup 8******/ 9const mongoose = require('mongoose'); 10mongoose.connect(process.env.MONGO_URI, { 11 useNewUrlParser: true, 12 useUnifiedTopology: true, 13 useCreateIndex: true, 14 useFindAndModify: false 15}) 16mongoose.connection.once('open', () => { 17 console.log('connected to mongo') 18}) 19 20app.set('view engine', 'jsx'); 21app.engine('jsx', require('express-react-views').createEngine()) 22app.use((req, res, next) => { 23 console.log('**********************') 24 console.log('***********Middleware checking in***********') 25 console.log('I run before all routes') 26 console.log('**********************') 27 next() 28}) 29 30app.use(express.urlencoded({ extended: true })) // Without this half my code wont work because i need req.body 31const methodOverride = require('method-override'); 32app.use(methodOverride('_method')); 33 34/* 35Index 36*/ 37app.get('/logs/', (req, res) => { 38 Log.find({}, (err, foundLogs)=>{ 39 if(err){ 40 res.status(404).send({ 41 msg: err.message 42 }) 43 } else { 44 res.render('Index', { 45 logs: foundLogs 46 }) 47 } 48 }) 49}) 50 51/* 52New 53*/ 54app.get('/logs/new', (req, res) => { 55 res.render('New') 56}) 57 58/* 59Delete 60*/ 61app.delete('/ logs/:id', (req, res) => { 62 Log.findByIdAndDelete(req.params.id, (err, foundLog)=>{ 63 if(err){ 64 res.status(404).send({ 65 msg: err.message 66 }) 67 } else { 68 res.redirect('/logs') 69 } 70 }) 71}) 72 73/* 74Put/Update 75*/ 76app.put('/logs/:id', (req, res) => { 77 if(req.body.shipIsBroken === 'on'){ 78 req.body.shipIsBroken = true; 79 } else { 80 req.body.shipIsBroken = false; 81 } 82 Log.findByIdAndUpdate(req.params.id, req.body, { new: true }, (err, updatedLog)=>{ 83 if(err){ 84 res.status(404).send({ 85 msg: err.message 86 }) 87 } else { 88 res.redirect('Index', { 89 log: updatedLog 90 }) 91 } 92 }) 93}) 94 95 96/* 97Create 98*/ 99app.post('/logs', (req, res) =>{ 100 if(req.body.shipIsBroken === 'on'){ 101 req.body.shipIsBroken = true; 102 } else { 103 req.body.shipIsBroken = false; 104 } 105 Log.create(req.body, (err, createdLog ) => { 106 if(err){ 107 res.status(404).send({ 108 msg: err.message 109 }) 110 } else { 111 console.log(createdLog); 112 res.redirect('/logs') 113 } 114}) 115}) 116 117 /* 118Edit 119*/ 120app.get('/logs/:id/edit', (req, res) => { 121 Log.findById(req.params.id, (err, foundLog)=>{ 122 if(err){ 123 res.status(404).send({ 124 msg: err.message 125 }) 126 } else { 127 res.render('Edit', { 128 log: foundLog 129 }) 130 } 131 }) 132}) 133 134/* 135Show 136*/ 137app.get('/logs/:id', (req, res) => { 138 Log.findById(req.params.id, (err, foundLog)=>{ 139 if(err){ 140 res.status(404).send({ 141 msg: err.message 142 }) 143 } else { 144 res.render('Show', { 145 log: foundLog 146 }) 147 } 148 }) 149}) 150 151 app.listen(PORT, () => { 152 console.log('in the building', PORT) 153}) 154

React.js

1const React = require('react'); 2class Edit extends React.Component { 3 render(){ 4 return ( 5 6 <form method="POST" action={`/logs/${this.props.log._id}?_method=PUT`}> 7 title: <input type="text" name="title" defaultValue={this.props.log.title}/><br/> 8 entry: <input type="text" name="entry" defaultValue={this.props.log.entry}/><br/> 9 shipIsBroken: 10 { this.props.log.shipIsBroken 11 ? <input type="checkbox" name="shipIsBroken" defaultChecked /> 12 : <input type="checkbox" name="shipIsBroken"/> 13 } 14 <br/> 15 <input type="submit" value="Submit Changes"/> 16 </form> 17 18 ) 19 } 20} 21module.exports = Edit;

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

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

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

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

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

suama

2021/06/26 05:04

なんとなく、キャストが必要というのは掴めるかと思いますが、エラーメッセージの前後の、何行目にエラーが出ているとか、どのアクション(POST? PUT?) でのエラーなのか、可能なら追記いただけますか? POSTの処理の時かな?とおもうのですが、PUT (Update) の箇所に、readyToEat というスキーマに定義されていないパラメーターも出ているので、ちょっと気になっています。
hiro_ike

2021/06/26 09:00

ご指摘ありがとうございます。 以前のコードのコピペが残っておりました。。。 上記と、ルーティング設定で else { res.redirect('Index', { log: updatedLog としたかったのですが、 else { res.render('Show', { log: updatedLog とすると、正常に更新できるのですが、 前者だとエラーになる理由ってお分かりになりますでしょうか。
hiro_ike

2021/06/26 09:02

あと、ベストアンサーとさせて頂きたいので、 解決方法にコメントいただけますと助かります。色々ありがとうございます。
suama

2021/06/26 14:36

リダイレクトはURLを転送してIndex 画面に「遷移」するので、log: updateLog を渡してはダメです。あと、findById... で取得できるのは1件で、Index は 複数を期待していますので、この点もエラーの原因ですね。 もう一度お願いなのですが、それぞれエラーになった際のエラーメッセージを、複数行貼っていただけませんでしょうか? エラーの発生した箇所について、推測でしかお返事できないので...。 リダイレクトのところは回答側にお返事したいと思います。
hiro_ike

2021/06/26 20:22

出ていたエラーは、 (1){"msg":"Cast to Boolean failed for value \"on\" (type string) at path \"shipIsBroken\""} (2)このサイトにアクセスできません。 上記2件で、ご指摘の箇所を修正して、(1)は解消して、ルーティングを下記に書き換えて(2)も解消となりました。 res.render('Show', { >リダイレクトはURLを転送してIndex 画面に「遷移」するので、log: updateLog を渡してはダメです。 なるほど。理解しました。お手数おかけ致しました。 お手隙の際に、回答に入力してもらえたら、ベストアンサーにしますのでどうぞよろしくお願い致します。 ありがとうございました。
suama

2021/06/26 23:32

こんにちは、ひとまず解消とのことで良かったです! ご自身で解決されたということで、回答欄にはわかった点をご自身で書く、というのも良いと思います。 簡単ですが、回答欄に書いておきますね。
guest

回答1

0

ベストアンサー

こんにちは。質問のほうでも少し書かせていただきましたが、エラーの発生に関して気になった点をいくつか書きますね。

{"msg":"Cast to Boolean failed for value "on" (type string) at path "shipIsBroken\”"}

こちらは、mongooseを用いてMongoDBに値を登録するときに、shipIsBroken のデータ型に Boolean を期待しているのだけれど String で渡って来ててダメです、といったエラーになりますね。

最初の段階でコードを見ると、POST のところでは

if (req.body.shipIsBroken === 'on') { req.body.shipIsBroken = true; }

と変換されていたので、POST の処理に関しては正しく扱えている気がしました。
そこで、エラーが出たのは POST のところではなく PUT のところかなと思いました。

そのため、質問のところで、以下のように聞いた次第です。

POSTの処理の時かな?とおもうのですが、PUT (Update) の箇所に、readyToEat というスキーマに定義されていないパラメーターも出ているので、ちょっと気になっています。

PUT のところでは、当初 readyToEat に対しての判定が書かれていて、req.body.shipIsBroken は変換をしていないようだったので、ここでエラーかなと思いました。
こちらで合っていますでしょうか?

何度か「エラーになった際のエラーメッセージを、複数行貼っていただけませんでしょうか?」とお願いをしたのは、エラーになったリクエストが POST でなのか、PUT でなのかをはっきりしておきたかったからです。


また、コードを修正して、画面を遷移させる場合ですが、リダイレクトはURLを「転送」してIndex 画面に「遷移」するので、log: updateLog を渡してはダメです。

あと、findById... で取得できるのは1件で、Index は 複数を期待していますので、この点もエラーの原因になるかと思います。

render の場合は、URL を変更せずに、処理のあとに対応するテンプレート (Show) を使って画面に結果を表示する、というものになります。

Express側のログと、ブラウザの開発者ツールのネットワークでのリクエストの流れを丁寧に見ていくと、違いがわかってくると思います。

違いを少しずつ確認してみてくださいね。

投稿2021/06/26 23:43

suama

総合スコア1997

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問