1. More Schema
- https://mongoosejs.com/docs/schematypes.html
// upload.pug
extends base
block content
if errorMessage
span=errorMessage
form(method="POST")
input(placeholder="Title", required, type="text", name="title", maxlength=80)
input(placeholder="Description", required, type="text", name="description", minlength=20)
input(placeholder="Hashtags, seperated by comma.", required, type="text", name="hashtags")
input(type="submit", value="Upload")
// Video.js
import mongoose from "mongoose";
const videoSchema = new mongoose.Schema({
/* 수동적으로 할수도 있던 것들을 mongoose덕에 자동으로 할 수 있음
데이터에 대한 구체적인 설정을 하는게 중요함 */
title: { type: String, required: true, trim: true, maxLenth: 80 },
description: { type: String, required: true, trim: true, minLength: 20 },
createdAt: { type: Date, required: true, default: Date.now() },
hashtags: [{ type: String, trim: true }],
meta: {
views: { type: Number, default: 0, required: true },
rating: { type: Number, default: 0, required: true },
},
});
const Video = mongoose.model("Video", videoSchema);
export default Video;
- 브라우저나 db나, 한쪽에서만 설정을 하게 되면 꼬일 수가 있으므로 양쪽에 안전하게 다 설정하는게 좋음
hashtags: hashtags.split(",").map((word) => `#${word}`),
- 현재 hashtags는 업로드할땐 잘 작동되나, 업로드된 데이터를 수정할 때 문제가 생김
- 수정할 때 string 데이터를 받으므로, 콤마를 기준으로 나누고 #이 붙는 코드가 재실행 되야함
- 나중에 edit을 다시 다루게 될때 수정
2. Documentation을 활용하여 videoRouter 수정
- 현재 업로드한 데이터를 클릭하면 영상 id로 이동하는데, 문제는 videoRouter가 이 주소를 어떻게 다루는지 모르는 상태
- 이전에는 id에 번호만 포함되게 regex을 사용했기에, regex을 지우면 다시 이동되지만, 경로상 /upload와 /id가 꼬이는 상태
- 배웠던 것처럼 /id 위에 /upload를 두면 해결할 수 있지만, documentation에서 id를 조사하여 regex을 생성하는 방법을 이용
- https://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html
- 24글자가 0~9, a~f와 맞는지 확인(24byte, 16진수) > /[0-9a-f]{24}
// videoRouter.js
import express from "express";
import { getEdit, watch, postEdit, getUpload, postUpload } from "../controllers/videoController";
const videoRouter = express.Router();
videoRouter.get("/:id([0-9a-f]{24})", watch);
videoRouter.route("/:id([0-9a-f]{24})/edit").get(getEdit).post(postEdit);
videoRouter.route("/upload").get(getUpload).post(postUpload);
export default videoRouter;
- regex은 잘 되지만 watch로 갈경우, video가 없기 때문에 오류 발생
- 클릭한 영상의 id를 모르기 때문에 findByID()를 사용
export const watch = async (req, res) => {
const { id } = req.params;
const video = await Video.findById(id);
console.log(video);
return res.render("watch", { pageTitle: video.title, video });
};
'개발 > Node.js' 카테고리의 다른 글
Mongoose Middleware(1) (0) | 2024.11.04 |
---|---|
Edit Video (0) | 2024.11.04 |
실제 데이터를 입력해보기 (0) | 2024.11.04 |
Callback Promise Return Render (0) | 2024.11.02 |
CRUD (0) | 2024.11.01 |