1. Document 만들기
- schema는 video의 구성요소와 데이터 형태를 갖추고 있음
- 유저가 비디오를 업로드할 때 해당 schema의 데이터들을 전송
- 생성일이나 meta 데이터는 자동으로 생성
- 비디오를 생성하려면 document가 필요함
// upload.pug
extends base
block content
form(method="POST")
input(placeholder="Title", required, type="text", name="title")
input(placeholder="Description", required, type="text", name="description")
input(placeholder="Hashtags, seperated by comma.", required, type="text", name="hashtags")
input(type="submit", value="Upload")
// videoController.js
export const postUpload = (req, res) => {
const { title, description, hashtags } = req.body;
const video = new Video({
title,
description,
createdAt: Date.now(),
hashtags: hashtags.split(",").map((word) => `#${word}`),
meta: {
views: 0,
rating: 0,
},
});
console.log(video);
return res.redirect("/");
};
- Video의 title로 number값이 들어와도 문제없이 string으로 변환됨
- Video의 meta로 string값이 들어오면 meta에 아무것도 없이 데이터가 생성
- 스마트한 object가 생성됐으며 mongoose가 데이터 타입의 유효성 검사를 도와주며 보호하고 있음
- 데이터의 형태를 미리 정해뒀을때의 장점
2. DB에 데이터 전송
- video가 mongoose model인 덕분에 video.save()를 사용할 수 있음
- save는 promise를 return 해주는데, save작업이 끝날때 까지 대기
export const postUpload = async (req, res) => {
const { title, description, hashtags } = req.body;
// video는 js에서만 존재하니 기다려줄 필요 X
const video = new Video({
title,
description,
createdAt: Date.now(),
hashtags: hashtags.split(",").map((word) => `#${word}`),
meta: {
views: 0,
rating: 0,
},
});
// save가 되면 db에 저장되면서 시간이 걸리니 기다려야함
const dbVideo = await video.save();
return res.redirect("/");
};
// new 와 create 두가지 방식
export const postUpload = async (req, res) => {
const { title, description, hashtags } = req.body;
await Video.create({
title,
description,
createdAt: Date.now(),
hashtags: hashtags.split(",").map((word) => `#${word}`),
meta: {
views: 0,
rating: 0,
},
});
return res.redirect("/");
};
// MongoDB
> use wetube
> show collections
> db.videos.find()
3. 오류가 발생할 경우
- 강제로 createdAt에 string값을 넣어보면 오류가 발생
ValidationError: Video validation failed: createdAt: Cast to date failed for value "babab" at path "createdAt"
- 특정 데이터가 없이 DB에 저장될 수 있음 - required가 없어서 에러없이 저장은 되지만 이러면 안됨
_id: ObjectId('672827301397e736dc0ebf4f'),
hashtags: [ '#어', '#쩌', '#냐', '#고' ],
title: '날짜가 없는데',
description: '저장되면 안되는데',
meta: { views: 0, rating: 0 },
__v: 0
ValidationError: Video validation failed: createdAt: Path `createdAt` is required.
- redirect가 되지않고 에러가 발생하며 무한로딩이 걸리므로 try catch를 사용
export const postUpload = async (req, res) => {
const { title, description, hashtags } = req.body;
try {
await Video.create({
title,
description,
//createdAt: Date.now(),
hashtags: hashtags.split(",").map((word) => `#${word}`),
meta: {
views: 0,
rating: 0,
},
});
return res.redirect("/");
} catch (error) {
return res.render("upload", {
pageTitle: "Upload Video",
errorMessage: error._message,
});
}
};
- createdAt은 required여야 하지만 매번 이렇게 하고 싶지는 않음
// Video.js
createdAt: { type: Date, required: true, default: Date.now },
- now()를 하게 되면 function을 즉각 실행하므로 우린 ()를 뺌
- mongodb와 mongoose는 스마트하므로 video를 만들면 알아서 처리해줌
- 프로젝트 도중 now()를 하게 되면, 서버가 켜진 시간을 기준으로 createdAt이 고정되어버리니 그냥 now로 씀
// Video.js
import mongoose from "mongoose";
const videoSchema = new mongoose.Schema({
title: { type: String, required: true },
description: { type: String, required: true },
createdAt: { type: Date, required: true, default: Date.now },
hashtags: [{ type: String }],
meta: {
views: { type: Number, default: 0, required: true },
rating: { type: Number, default: 0, required: true },
},
});
const Video = mongoose.model("Video", videoSchema);
export default Video;
// videoController.js
export const postUpload = async (req, res) => {
const { title, description, hashtags } = req.body;
try {
await Video.create({
title,
description,
//createdAt: Date.now(),
hashtags: hashtags.split(",").map((word) => `#${word}`),
});
return res.redirect("/");
} catch (error) {
return res.render("upload", {
pageTitle: "Upload Video",
errorMessage: error._message,
});
}
};
'개발 > Node.js' 카테고리의 다른 글
Edit Video (0) | 2024.11.04 |
---|---|
More Schema, Router 수정 (0) | 2024.11.04 |
Callback Promise Return Render (0) | 2024.11.02 |
CRUD (0) | 2024.11.01 |
Mongoose (0) | 2024.11.01 |