-
Youtube 만들기 - 9) 구독 비디오 페이지 만들기NODE.JS 2021. 5. 14. 19:33
이번에는 구독한 비디오만 나타나는 페이지를 만들 것이다.
순서 src>components>views>SubscriptionPage>SubscriptionPage.js파일을 만들어준다.
import React from 'react' function SubscriptionPage() { return ( <div> SubscriptionPage </div> ) } export default SubscriptionPage
App.js에 라우트를 추가해준다.
import SubscriptionPage from "./views/SubscriptionPage/SubscriptionPage"; <Route exact path="/subscription" component={Auth(SubscriptionPage, null)} />
랜딩페이지에서의 템플릿을 복사해서 가져온다(비슷하기 때문에)
import React ,{useEffect,useState} from 'react' import { FaCode } from "react-icons/fa"; import {Card, Icon, Avatar, Col, Typography, Row} from 'antd'; import { response } from 'express'; import moment from 'moment'; import Axios from 'axios'; const {Title} = Typography const {Meta} = Card; function SubscriptionPage() { const [Video, setVideo] = useState([]) useEffect(() => { Axios.get('/api/video/getVideos') .then(response =>{ if(response.data.success){ setVideo(response.data.videos) } else{ alert('비디오 가져오기를 실패 했습니다.') } }) }, [])//input 부분이 없으면 계속 실행 있으면 한번만 실행 const renderCards = Video.map((video,index)=>{ var minutes = Math.floor(video.duration/60); var seconds = Math.floor((video.duration - minutes*60)); return <Col lg = {6} md={8} xs={24}> {/* 하나의 동영상에 해당하는 페이지로 이동 */} <a href={`/video/post/${video._id}`}> <div style={{ position:'relative'}}> <a href={`/video/${video._id}`}></a> <img style = {{width:'100%'}} src={`http://localhost:5000/${video.thumbnail}`} alt=""/> <div className="duration"> <span>{minutes}:{seconds}</span> </div> </div> </a> <br/> <Meta avatar={ // Avatar는 유저 이미지 <Avatar src={video.writer.image}/> } title = {video.title} description="" /> <span>{video.writer.name}</span><br/> <span style={{marginLeft:'3rem'}}>{video.views} views</span> - <span>{moment(video.createdAt).format("MMM Do YY")}</span> </Col> }) return ( <div style={{ width:'85%', margin:'3rem auto'}}> <Title level={2}>Recommended</Title> <hr/> {/* Row하나당 Column의 갯수 정한다. */} <Row gutter = {[32, 16]}> {renderCards} </Row> </div> ) } export default SubscriptionPage
subscription페이지를 왼쪽 메뉴(탭)에 추가해보자.
다음과 같이 변경해준다.
import React from 'react'; import { Menu } from 'antd'; const SubMenu = Menu.SubMenu; const MenuItemGroup = Menu.ItemGroup; function LeftMenu(props) { return ( <Menu mode={props.mode}> <Menu.Item key="mail"> <a href="/">Home</a> </Menu.Item> <Menu.Item key="mail"> <a href="/subscription">Subscription</a> </Menu.Item> </Menu> ) } export default LeftMenu
이제 가져오는 비디오 데이터를 조금 수정해보자.
axios를 다음과 같이 수정해준다.
여기서 비디오를 가져올 때는 조건에 맞는 것을 가져와야하므로 properties를 같이 넣어준다.
useEffect(() => { const subscriptionVariables = { userFrom: localStorage.getItem('userId') } Axios.post('/api/video/getSubscriptionVideos',subscriptionVariables) .then(response =>{ if(response.data.success){ setVideo(response.data.videos) } else{ alert('비디오 가져오기를 실패 했습니다.') } }) }, [])//input 부분이 없으면 계속 실행 있으면 한번만 실행
axios를 생성했으니 video.js파일에가서 route를 생성해줘야한다.
mongodb 데이터에 가보면 이렇게 subscribers정보들이 나와있으니 이것을 이용해서 가져온다.
router.post('/getSubscriptionVideos', (req, res)=>{ //자신의 아이디를 가지고 구독하는 사람들을 다 찾는다. Subscriber.find({userFrom: req.body.userFrom}) .exec((err, SubscriberInfo) => { if(err) return res.status(400).send(err); //구독하는 사람들의 정보들이 SubscriberInfo에 담긴다. let subscribedUser = []; SubscriberInfo.map((subscriber, i)=>{ subscribedUser.push(subscriber.userTo); }) //찾는 사람들의 비디오를 가지고 온다. //아이디에 맞는 사람의 정보를 가져와야한다. (그런데 구독한유저가 몇명인지 모르니까 $in을 사용한다. (in을 사용하면 subscribedUser안의 사람들 개개인마다 가져온다.)) Video.find({writer: {$in : subscribedUser} }) .populate('writer') //아이디만 가지고 있으니까 populate해서 유저정보를 가지고 온다. .exec((err, videos)=>{ if(err) return res.status(400).send(err); res.status(200).json({succes:true, videos}) }) }) })
완성된 화면 'NODE.JS' 카테고리의 다른 글
Youtube 만들기 - 11) 좋아요, 싫어요 기능 만들기 (0) 2021.05.15 Youtube 만들기 - 10) 댓글 기능 만들기 (0) 2021.05.14 Youtube 만들기 - 8) 구독기능 만들기 (0) 2021.05.14 Youtube 만들기 - 7) 비디오 디테일 페이지 만들기 (0) 2021.05.14 Youtube 만들기 - 6) 랜딩페이지에 비디오들 나타내기 (0) 2021.05.14