レビュー機能との格闘
深夜のコーディング作業。レビュー機能の実装に取り組んでいるが、なかなか思うように進まない。
TAKA: 「えーと…レビュー機能ってどう実装するんでしたっけ…」
AI老師: 「まずは基本的なファイル構成を確認するのじゃ。models/review.js、routes/reviews.js、そしてindex.jsの内容を見せなさい」
TAKA: 「はい…こんな感じです」
// models/review.js
const mongoose = require('mongoose');
const reviewSchema = new mongoose.Schema({
videoId: { type: mongoose.Schema.Types.ObjectId, ref: 'Video', required: true },
user: { type: String, required: true },
rating: { type: Number, required: true, min: 1, max: 5 },
comment: { type: String, required: true }
});
AI老師: 「なるほど。モデルの定義は問題なさそうじゃ。次にルーティングの設定を見せなさい」
TAKA: 「routes/reviews.jsはこんな感じです…」
// routes/reviews.js
router.post('/', auth, async (req, res) => {
const { videoId, rating, comment } = req.body;
try {
const review = new Review({
videoId,
userId: req.user._id,
rating,
comment
});
await review.save();
res.status(201).send(review);
} catch (error) {
res.status(400).send(error);
}
});
AI老師: 「ここに問題があるぞ。モデルでは’user’フィールドを定義しているのに、ルーティングでは’userId’を使っているではないか」
TAKA: 「あ…そうなんですね。でも、どう直せばいいんでしょう?」
AI老師: 「自分で考えてみるのじゃ。モデルとルーティングの定義を比較して、違いを見つけられないか?」
TAKA:(心の声)「めんどくさいなぁ…AI老師に答えを教えてもらえばいいのに…」
デバッグの試行錯誤
AI老師: 「では、Postmanを使ってテストしてみよう。まずはログインしてJWTトークンを取得するのじゃ」
TAKA: 「え?なんですかそれ…」
AI老師: 「認証用のトークンじゃよ。これがないとレビューを投稿できんのじゃ」
TAKA: 「はぁ…なんで認証とか必要なんですか…面倒くさい…」
AI老師: 「セキュリティは重要なのじゃ!誰でも自由にレビューを投稿できてしまったら、スパムだらけになってしまうぞ」
問題の特定
TAKA: 「とりあえずPostmanで試してみます…あれ?エラーが…」
Cannot POST /api/users/login
AI老師: 「ログインのエンドポイントが正しく設定されていないようじゃな。routes/users.jsの内容も確認する必要があるぞ」
TAKA: 「もう…なんでこんなに複雑なんですか…」
AI老師: 「Web開発では、一つの機能を実装するにも様々な要素が絡み合っているのじゃ。すべてAIに頼るのではなく、自分で理解する努力も必要じゃぞ」
TAKA: 「はい…分かりました…」(心の声:「いや、それが嫌だからAI使ってるんですけど…」)
【AI任せプログラマーTAKAの今日のひとこと】
TAKA: 「今日はレビュー機能の実装で苦戦しました。モデルとルーティングの設定の違いを見つけられたのは良かったけど、認証周りの設定で詰まってしまって…。AI老師には『自分で考えろ』って言われるし…。ま、気にせずこのままGo!」