CastError: Cast to ObjectId failed が発生する原因と解決方法について
解決したいこと
プログラミングをはじめて1ヶ月半ぐらいのものです。
udemyのweb-developer-bootcampという講義でNode.jsとExpressを使って、MongoDBでデータを管理するYelpCampというキャンプ場管理アプリを開発しています。
新規登録フォームからキャンプ場を追加し、その詳細ページに遷移することはできるのですが、詳細ページから編集ページに移動しようとするエラーが発生します。
質問
・なぜreq.params.idに不正な値(例えば画像URL)が入ってしまうのか、原因が分かりません。
・このエラーを防ぐためのルーティングやバリデーションのベストプラクティスがあれば教えてください。
・MongoDBのObjectIdとして正しくIDを受け取る方法についてアドバイスをお願いします。
発生している問題・エラー
エラー発生場所:
編集ページのルート app.get("/campgrounds/:id/edit", ...) にアクセスしたとき
現象:
req.params.idの値がMongoDBのObjectIdとして認識されず、画像URLなどのような不正な文字列がIDとして扱われてしまい、CastErrorが発生しているようです。
期待する動作:
/campgrounds/:id/editの:id部分にMongoDBのObjectIdが入るべきですが、フォームから送信したデータや他のフィールドと混同されている可能性があります。
出ているエラーメッセージを入力
CastError: Cast to ObjectId failed for value "nfjewnafienfiawnfiene" (type string) at path "_id" for model "Campground"
該当するソースコード
app.get("/campgrounds/:id/edit", async (req, res) => {
console.log(req.params); // ここでIDを確認しています
try {
const editCampground = await Campground.findById(req.params.id);
if (!editCampground) {
return res.status(404).send('Campground not found');
}
res.render("campgrounds/edit", { editCampground });
} catch (e) {
res.status(500).send(e.message);
}
});
自分で試したこと
ここに問題・エラーに対して試したことを記載してください。
・**console.log(req.params)**でreq.params.idを確認したところ、期待しているObjectIdではなく、画像URLのような文字列が出力されました。
・ルートの順番を確認し、/campgrounds/newのようなルートを先に定義しています。
・show.ejsでのリンク生成時に、campground._idを正しく指定しています。
編集する