๐Ÿ“ ์˜ค๋Š˜ ํ•œ ๊ฒƒ

  1. ์—๋Ÿฌ ํ•ด๊ฒฐ - video.duration ๊ฐ€์ ธ์˜ค๊ธฐ

  2. ๋ณต์Šต - SETUP / EXPRESS / MONGODB AND MONGOOSE(๊ฐ€์งœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)


๐Ÿ“š ๋ฐฐ์šด ๊ฒƒ

์—๋Ÿฌ ํ•ด๊ฒฐ

1. video.duration ๊ฐ€์ ธ์˜ค๊ธฐ

1) ์—๋Ÿฌ ์›์ธ

๋กœ์ปฌ์—์„œ AWS S3๋กœ ์ €์žฅ์†Œ๋ฅผ ์˜ฎ๊ธด ํ›„ video.duration์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•ด ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด์— ์ „์ฒด ๋™์˜์ƒ์˜ ๊ธธ์ด๊ฐ€ ๋œจ์ง€ ์•Š๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” video.duration์„ ๋ชป ๋ฐ›์•„์˜ค๋Š” ๊ฒŒ ๋ฌธ์ œ์ธ ์ค„ ์•Œ์•˜๋Š”๋ฐ ์•Œ๊ณ  ๋ณด๋‹ˆ ์• ์ดˆ์— lodeaddata ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์˜€๋‹ค. loadedmetadata๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์–ด๋–ป๊ฒŒ ํ•ด๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๋‹ค.
(ํ˜„์žฌ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ๋Š” ํ–ˆ์ง€๋งŒ, loadeddata ์ด๋ฒคํŠธ๊ฐ€ ์™œ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ธ์ง€๋Š” ์•„์ง๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค.)

2) ์—๋Ÿฌ ํ•ด๊ฒฐ

๊ทธ๋ž˜์„œ watch ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€์„œ video๋งŒ ์žˆ๋‹ค๋ฉด video.duration์„ ๊ฐ€์ ธ์˜ค๋Š” handleLoadedData ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ ์‹คํ–‰๋˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

// videoPlayer.js
const formatTime = (seconds) => new Date(seconds * 1000).toISOString().substring(14, 19);

const handleLoadedData = () => {
  totalTime.innerText = formatTime(Math.floor(video.duration));
  timeline.max = Math.floor(video.duration);
};

// ์ถ”๊ฐ€ โ—
if (video) {
  handleLoadedData();
}

video.addEventListener("loadeddata", handleLoadedData);

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡๊ฒŒ๋งŒ ์ž‘์„ฑํ•˜๋ฉด heroku์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ฐ˜๋Œ€๋กœ Local์—์„œ๋Š” videoplayer๊ฐ€ ์•„์˜ˆ ๋œจ์ง€ ์•Š์œผ๋ฉด์„œ ์ฝ˜์†”์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ์ถœ๋ ฅ๋๋‹ค.

Uncaught RangeError: Invalid time value
at Date.toISOString ()

watch ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๊ธฐ๋งŒ ํ•˜๋ฉด(๋‹ค์‹œ ๋งํ•ด, video.duration์„ ํฌํ•จํ•œ ๋™์˜์ƒ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” loadedmetadata ์ด๋ฒคํŠธ๊ฐ€ ์ฐจ๋งˆ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ์ „์—) video.duration ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” handleLoadedData ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— video.duration์ด NAN ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋˜์–ด formatTime ํ•จ์ˆ˜์—์„œ NAN * 1000์„ ์ •์ƒ์ ์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†์–ด ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์˜€๋‹ค.

๊ทธ๋ž˜์„œ ์•„์˜ˆ handleLoadedData ํ•จ์ˆ˜๋Š” watch ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ”์„ ๋•Œ & Heroku ์„œ๋ฒ„์— ์žˆ์„ ๋•Œ๋งŒ ์‹คํ–‰๋˜๋„๋ก isHeroku ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

const formatTime = (seconds) => new Date(seconds * 1000).toISOString().substring(14, 19);

const handleLoadedData = () => {
  totalTime.innerText = formatTime(Math.floor(video.duration));
  timeline.max = Math.floor(video.duration);
};

// ์ถ”๊ฐ€ โ—
const isHeroku = process.env.NODE_ENV === "production";

// ์ˆ˜์ • โ—
if (isHeroku && video) {
  handleLoadedData();
}

video.addEventListener("loadeddata", handleLoadedData);

์ด์ œ Heroku์™€ Local ๋ชจ๋‘์—์„œ ์ •์ƒ์ ์œผ๋กœ video.duration์„ ๊ฐ€์ ธ์™€ ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด์— ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.




๋ณต์Šต

์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๊ตฌํ˜„ ์‹œ์ž‘
์‹ค์ œ ์ฝ”๋“œ๋Š” github์— ์˜ฌ๋ฆผ(wetube_v2)

1. SET UP

  • [TIL] 211111 ==> node.js / npm ์ด์šฉํ•ด package.json ํŒŒ์ผ ์ƒ์„ฑ / scripts
  • [TIL] 211112 ==> npm i / dependencies
  • [TIL] 211113 ==> Babel / Nodemon
  • [TIL] 211119 ==> nodemon ์—๋Ÿฌ(โˆต /mnt) ํ•ด๊ฒฐ

2. EXPRESS

1) routers & controllers

  • [TIL] 211120 ==> ์„œ๋ฒ„ ๊ตฌ์ถ• / GET Request / Responses
  • [TIL] 211121 ==> morgan middleware / routers
  • [TIL] 211122 ==> ๋ชจ๋“ˆํ™”(routers & controllers) / templates

ํ™ˆ / ํšŒ์›๊ฐ€์ž… / ๋กœ๊ทธ์ธ /๊ฒ€์ƒ‰

app.use("/", rootRouter);

ํ”„๋กœํ•„ ๋ณด๊ธฐ / ํ”„๋กœํ•„ ์ˆ˜์ • / ๋กœ๊ทธ์•„์›ƒ

app.use("/", userRouter);

๋น„๋””์˜ค ์—…๋กœ๋“œ / ๋น„๋””์˜ค ๋ณด๊ธฐ / ๋น„๋””์˜ค ์ˆ˜์ • / ๋น„๋””์˜ค ์‚ญ์ œ

app.use("/", videoRouter);

2) pug

  • [TIL] 211122 ==> pug ์„ค์ • / #{JS ์ฝ”๋“œ} / include
  • [TIL] 211123 ==> extends & block / #{๋ณ€์ˆ˜} / ์กฐ๊ฑด๋ฌธ / ๋ฐ˜๋ณต๋ฌธ / mixins

3. MONGODB AND MONGOOSE

  • ๐Ÿ”ฅ [TIL] 211124 ==> ๊ฐ€์งœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(home, watch, edit, upload) / ์ƒ๋Œ€ ๊ฒฝ๋กœ vs ์ ˆ๋Œ€ ๊ฒฝ๋กœ / GET Method vs POST Method / req.params / req.body

โœจ ๋‚ด์ผ ํ•  ๊ฒƒ

  1. ๋ณต์Šต ๊ณ„์†ํ•˜๊ธฐ - mongoDB & mongoose
profile
dev log

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด

Powered by GraphCDN, the GraphQL CDN