무료
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
파일 업로드가 되지 않습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 좋은 강의 잘 듣고 있습니다. #5 비디오 저장하기에서 비디오 업로드가 되지 않습니다. 문제는 에러 로그도 뜨지 않아서 어디가 틀렸는지 모르겠네요. 참고로 videoUploadPage,js의 onDrop 함수에서 files 로그를 찍어봤을 때 나오는 걸 보니 axios 이하 부분이 문제인 것 같습니다. 첨부드리는 저장소 한 번 확인 가능하실까요? https://github.com/zui0202/boilerplate-mern-stack-master 감사합니다.
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
보일러 플레이트 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요, 해당 강의를 시작하기 위해 npm install을 하고, 오류가 나는 바람에 보일러 플레이트에 대한 이해와 왜 안되는지 다른 수강생분들의 문의글을 참고했습니다. 1. 보일러 플레이트가 프로젝트를 시작할 때마다 다른 패키지들을 일일이 다운받는게 힘듭니다. 그 패키지들을 한데 모은 선생님만의 패키지 폴더가 이 수업에서 사용하는 보일러 플레이트가 맞는건가요? 2. 우선 에러를 확인하고 어찌저찌 해결되었으나 어정쩡하게 해결된 감이 있습니다. 이 수업에서 사용되는 보일러 플레이트는 선생님이 올려주신 리액트, 노드 기초 강의에서도 똑같이 만들어지는 건가요?(폴더 구조, index.js, dev.js 등) 해당 강의를 들으면 저만의 보일러 플레이트를 만들 수 있고, 그걸 활용해 해당 수업을 들어도 되는지 묻고 싶습니다! 3. 보일러 플레이트는 기초 강의를 듣고 만들수 있는건가요? 4. packge.json을 확인해 필요한 노드의 버전도 다른걸 알게 되었는데, bcrypt 오류를 지우고 제 컴퓨터의 최신 노드로 npm install을 해도 문제가 없는건가요? 이 강의대로 실무에 적용해도 괜찮을까요?
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
import {Icon} 에러 나시는 분
직접 공식문서 찾아드리려 했지만 이분께서 정리를 잘 해주셨습니다. ant design업그레이드 되면서 바뀐 문제입니다. 참고: https://shinye0213.tistory.com/317
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
강의 잘 듣고 있습니다.
강의 듣다가 궁금한게 생겼는데 혹시 회원가입 query문 같은 경우는 select한후 insert문을 쓰는데 혹시 이걸 한개query문으로 만들수가 있나요?? 강의 내용이 아니라 죄송합니다 ㅠ
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
npm install 에 대한 질문입니다.
node 는 v16.13.1 버전을 사용하고 있습니다. vsCode Terminal 창에서 npm install을 했더니 npm ERR! code ENOENT npm ERR! syscall open npm ERR! path C:\Users\psj97\Downloads\boilerplate-mern-stack-master/package.json npm ERR! errno -4058 npm ERR! enoent ENOENT: no such file or directory, open 'C:\Users\psj97\Downloads\boilerplate-mern-stack-master\package.json' npm ERR! enoent This is related to npm not being able to find a file. npm ERR! enoent npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\psj97\AppData\Local\npm-cache\_logs\2022-03-04T06_06_10_724Z-debug.log 이와 같은 에러가 발생하면서 package-lock.json 파일이 생성됬습니다. 어떻게 해결하면 되나요??
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
aws lightsail 서버에 올릴 때 package.json내 script 설정 방법 문의
강의를 통해 많이 배우고 있습니다. 감사합니다. ^^~~ mongodb가 회사에서 접속이 안되는 이슈가 있어 (보안이슈) aws lightsail에 올려 강의를 따라하며 공부하려 환경설정 중에 있습니다. 서버에 boilerplate 다운받아 mongodb 설정 완료하고 콘솔에서는 DB connected 까지 확인했으나, 고정 IP로 접속해보아도 페이지가 보이지 않네요.... package.json의 script 부분에 production 시 설정 방법 문의 드립니다.
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
너무 답답해요 ㅠㅠ POST http://localhost:3000/api/video/uploads net::ERR_FAILED 라고만 뜹니다.
다른 에러 로그도 안 뜨니 사람 미치고 팔짝 뛸 노릇이네요. 몇시간째 삽질 중인데 해결방책이 안 나와요. 검색해봐도 cors관련 에러 해결만 뜨고.... server/index.js const express = require('express'); const router = express.Router(); const multer = require('multer'); //var ffmpeg = require('fluent-ffmpeg'); //const { Video } = require("../models/Video"); //const { Subscriber } = require("../models/Subscriber"); //const { auth } = require("../middleware/auth"); const storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, 'uploads/') }, filename: (req, file, cb) => { cb(null, `${Date.now()}_${file.originalname}`) } }) const fileFilter = (req, file, cb) => { // mime type 체크하여 원하는 타입만 필터링 if (file.mimetype == 'video/mp4' ) { cb(null, true); } else { cb({msg:'mp4 파일만 업로드 가능합니다.'}, false); } } const upload = multer({ storage: storage, fileFilter: fileFilter }).single("file") router.post("/uploads", (req, res) => { upload(req, res, err => { if (err) { return res.json({ success: false, err }) } else { return res.json({ success: true, filePath: res.req.file.path, fileName: res.req.file.filename }) } }) }); module.exports = router; [routes/video.js] const express = require("express"); const app = express(); const bodyParser = require("body-parser"); const cookieParser = require("cookie-parser"); const config = require("./config/key"); // const mongoose = require("mongoose"); // mongoose // .connect(config.mongoURI, { useNewUrlParser: true }) // .then(() => console.log("DB connected")) // .catch(err => console.error(err)); const mongoose = require("mongoose"); const connect = mongoose.connect(config.mongoURI, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('MongoDB Connected...')) .catch(err => console.log(err)); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use(cookieParser()); app.use('/api/users', require('./routes/users')); app.use('/api/video', require('./routes/video')); //app.use('/api/subscribe', require('./routes/subscribe')); //app.use('/api/comment', require('./routes/comment')); //app.use('/api/like', require('./routes/like')); //use this to show the image you have in node js server to client (react js) //https://stackoverflow.com/questions/48914987/send-image-path-from-node-js-express-server-to-react-client app.use('/uploads', express.static('uploads')); // Serve static assets if in production if (process.env.NODE_ENV === "production") { // Set static folder app.use(express.static("client/build")); // index.html for all page routes app.get("*", (req, res) => { res.sendFile(path.resolve(__dirname, "client", "build", "index.html")); }); } const port = process.env.PORT || 5000 app.listen(port, () => { console.log(`Server Running at ${port}`) }); [VideoUploadPage.js] import React, { useState } from 'react'; import { Typography, Button, Form, message, Input, icon } from 'antd'; import Dropzone from 'react-dropzone'; import * as axios from 'axios'; import icons from '@ant-design/icons'; const { TextArea } = Input; const { Title } = Typography; const PrivateOptions = [ {value: 0, label: "Private"}, {value: 1, label: "Public"} ]; const CategoryOptions = [ {value: 0, label: "Film & Animation"}, {value: 1, label: "Autos & Vehicles"}, {value: 2, label: "Music"}, {value: 3, label: "Pets & Animals"} ]; function VideoUploadPage(props) { const [VideoTitle, setVideoTitle] = useState(""); const [Description, setDescription] = useState(""); const [Private, setPrivate] = useState(0); const [Category, setCategory] = useState("Film & Animation"); const onTitleChange = (e) => { setVideoTitle(e.currentTarget.value); } const onDescriptionChange = (e) => { setDescription(e.currentTarget.value); } const onPrivateChange = (e) => { setPrivate(e.currentTarget.value); } const onCategoryChange = (e) => { setCategory(e.currentTarget.value); } const onDrop = (files) => { let formData = new FormData; const config = { header: { 'content-type': 'multipart/form-data' } } //console.log(files) formData.append("file", files[0]) axios.post('/api/video/uploads', formData, config) .then(response => { if(response.data.success) { console.log(response.data); } else { alert('Video upload failed'); } }) } const onSubmit = () => { console.log('submit'); } return ( <div style={{ maxWidth: '700px', margin: '2rem auto' }}> <div style={{ textAlign: 'center', marginBottom: '2rem' }}> <Title level={2}>Upload Video</Title> </div> <Form onSubmit> <div style={{ display: 'flex', justifyContent: 'space-between' }}> {/* Drop zone */} <Dropzone onDrop={onDrop} multiple={false} maxSize={800000000}> {({ getRootProps, getInputProps }) => ( <div style={{ width: '300px', height: '240px', border: '1px solid lightgray', display: 'flex', alignItems: 'center', justifyContent: 'center' }} {...getRootProps()} > <input {...getInputProps()} /> <icon type="plus" style={{ fontSize: '3rem' }} /> </div> )} </Dropzone> {/* Thumbnail */} <div> <img src alt /> </div> </div> <br /> <br /> <label>Title</label> <Input onChange={onTitleChange} value={VideoTitle} /> <br /> <br /> <label>Description</label> <TextArea onChange={onDescriptionChange} value={Description} /> <br /> <br /> <select onChange={onPrivateChange}> {PrivateOptions.map((item, index) => ( <option key={index} value={item.value}>{item.label}</option> ))} </select> <br /> <br /> <select onChange={onCategoryChange}> {CategoryOptions.map((item, index) => ( <option key={index} value={item.value}>{item.label}</option> ))} </select> <br /> <br /> <Button type="primary" size="large" onClick={onSubmit}> Submit </Button> </Form> </div> ); } export default VideoUploadPage;
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
setState를 해도 state가 수정되지 않습니다...
강사님 강의 정말 잘 보고 있습니다. 열심히 따라하던 도중에 문제가 생겼는데 도저히 해결하지 못해서 질문 올립니다. VideoDetailPage.js에서 Comment를 받아오기 위해서 getComment api까지 작성한 상태입니다. getComment에서 response.data.Comments에 값을 가져와서 Comments state를 수정하기 위해 setComments를 호출해도 state가 수정되지 않습니다.... 디비랑 비교해서 확인해보면 response.data.Comments까지는 데이터가 잘 들어오는데 state가 갱신이 안됩니다... 혹시나해서 제 깃허브 주소도 남깁니다. https://github.com/uyt8989/youtube_clone
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
비디오 업로드시 err 발생..
강의 잘 따라 하고 있는데요 ~ 모든 코드 동일하게 작성 햇는데 onSubmit 하면 router에서 if( err) 부분을 return 합니다. 바로 400 에러를 발생하고 {"success":false,"err":{"driver":true,"name":"MongoError","index":0,"code":11000,"keyPattern":{"email":1},"keyValue":{"email":null},"errmsg":"E11000 duplicate key error collection: myFirstDatabase.videos index: email_1 dup key: { email: null }"}} 이러한 response를 보여줍니다 어떤 문제인가요 ..ㅜ email: null 문제가 어떤 부분때문인지 ...
- 해결됨따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
썸네일 저장 시 504에러 나시는 분들 참고하세요!
1. 썸네일 저장 자체가 안되는 문제 강의에서는 에러가 나도 uploads/thumbnails폴더에 썸네일이 저장은 됐었으나 저는 저장도 안되었습니다. 2. 해결 방법 routes/video.js 파일의 ffmpeg.ffprobe(req.body.url, function (err, metadata) { ... }); 상단에 아래처럼 ffmpeg.exe의 경로 추가하기
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
복잡도에 관해서 궁금합니다
안녕하세요 ! 우선 이렇게 좋은 내용의 강의 무료로 공유해주셔서 진심으로 감사드립니다. 선생님 덕분에 정말 즐겁게 공부하고 있습니다. 다름이 아니라 모델(LIke.js, DisLike.js)을 만드는 과정에서 궁금증이 생겼습니다. Like와 DisLike 모델을 만들고 각각의 컬렉션을 통해서 좋아요 싫어요를 관리하게 될 경우, 사이트 내 영상갯수와 댓글이 많아지고 좋아요, 싫어요 숫자가 많아질수록 한번 videoDetailPage로 들어갈때마다 like dislike 순회를 해서 좋아요 수를 체크해야하니 video 컬렉션 내에 views처럼 만들어 저장하는 편이 효율이 좋지않나요?? 실제로 관련 서비스 제작에서도 선생님이 알려주신 방법과 같이 컬렉션을(모델이라는 표현이 맞는건가요?) 따로 만들어 관리하는지 궁금합니다!
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
state 관련 궁금증
안녕하세요 항상 양질의 강의 감사히 잘 보고 있습니다. 다름이 아니라 state 관련해서 궁금증이 생겨서 여쭤보고 싶습니다. 너무 기초적인 질문일지도 모르지만 아직 처음배우고 있어서 양해부탁드립니다..! State의 경우 Redux를 이용해서 store에 저장하려고 state가 있다고 이해하고 있는데 redux devTools를 봐도 그렇고 리듀서나 디스패치가 없어서 store에 비디오 관련 state가 저장안되는 건 알겠는데 그렇다면 강의에서 현재 useState를 왜 사용하는건지 궁금합니다. 그냥 const나 배열을 사용하면 안되나요..??
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
파일이 업로드 안됩니다.
C:\Users\mine\Desktop\boilerplate-mern-stack-master>npm run dev > react-boiler-plate@1.0.0 dev > concurrently "npm run backend" "npm run start --prefix client" [0] [0] > react-boiler-plate@1.0.0 backend [0] > nodemon server/index.js [0] [1] [1] > client@0.1.0 start [1] > react-scripts start [1] [0] [nodemon] 1.19.4 [0] [nodemon] to restart at any time, enter `rs` [0] [nodemon] watching dir(s): *.* [0] [nodemon] watching extensions: js,mjs,json [0] [nodemon] starting `node server/index.js` [0] C:\Users\mine\Desktop\boilerplate-mern-stack-master\node_modules\express\lib\router\index.js:458 [0] throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn)) [0] ^ [0] [0] TypeError: Router.use() requires a middleware function but got a Object [0] at Function.use (C:\Users\mine\Desktop\boilerplate-mern-stack-master\node_modules\express\lib\router\index.js:458:13) [0] at Function.<anonymous> (C:\Users\mine\Desktop\boilerplate-mern-stack-master\node_modules\express\lib\application.js:220:21) [0] at Array.forEach (<anonymous>) [0] at Function.use (C:\Users\mine\Desktop\boilerplate-mern-stack-master\node_modules\express\lib\application.js:217:7) [0] at Object.<anonymous> (C:\Users\mine\Desktop\boilerplate-mern-stack-master\server\index.js:34:5) [0] at Module._compile (node:internal/modules/cjs/loader:1101:14) [0] at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10) [0] at Module.load (node:internal/modules/cjs/loader:981:32) [0] at Function.Module._load (node:internal/modules/cjs/loader:822:12) [0] at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) [0] at node:internal/main/run_main_module:17:47 [0] [nodemon] app crashed - waiting for file changes before starting... [1] [HPM] Proxy created: / -> http://localhost:5000 [1] i 「wds」: Project is running at http://192.168.189.1/ [1] i 「wds」: webpack output is served from [1] i 「wds」: Content not from webpack is served from C:\Users\mine\Desktop\boilerplate-mern-stack-master\client\public [1] i 「wds」: 404s will fallback to / [1] Starting the development server... [1] [1] Browserslist: caniuse-lite is outdated. Please run: [1] npx browserslist@latest --update-db [1] Compiled with warnings. [1] [1] ./src/components/views/VideoUploadPage/VideouploadPage.js [1] Line 2:36: 'Message' is defined but never used no-unused-vars [1] Line 26:12: 'Private' is assigned a value but never used no-unused-vars [1] Line 27:12: 'Category' is assigned a value but never used no-unused-vars [1] Line 45:24: Missing '()' invoking a constructor new-parens [1] Line 88:25: Invalid alt value for img. Use alt="" for presentational images jsx-a11y/alt-text [1] [1] ./src/components/views/LoginPage/LoginPage.js [1] Line 74:11: 'dirty' is assigned a value but never used no-unused-vars [1] Line 79:11: 'handleReset' is assigned a value but never used no-unused-vars [1] [1] ./src/components/views/RegisterPage/RegisterPage.js [1] Line 92:11: 'dirty' is assigned a value but never used no-unused-vars [1] Line 97:11: 'handleReset' is assigned a value but never used no-unused-vars [1] [1] Search for the keywords to learn more about each warning. [1] To ignore, add // eslint-disable-next-line to the line before. [1] [1] [HPM] Error occurred while trying to proxy request /api/users/auth from localhost:3000 to http://localhost:5000 (ECONNREFUSED) (https://nodejs.org/api/errors.html#errors_common_system_errors) 이전 강의 까지는 원활하게 되었는데, 이 강의를 듣고, 로그인도 안되는 상태가 되고 video 화면도 forgot password를 누르면 나와서 그 화면으로 가야하는 상태까지 되었습니다. 어떻게 해야할까요?
- 해결됨따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
BoilerPlate 코드 관련해서 궁금한 점이 있습니다.
올려주신 보일러플레이트 코드 뜯어보면서 Formik과 Yup 코드를 어느정도 이해했는데 클라이언트 로그인 component와 회원가입 component에 있는 코드들 중 역할이 짐작이 안가는 것들이 있어 질문드리려고 합니다. {errors.name && touched.name && ( <div className="input-feedback">{errors.name}</div> )} 이런 코드들이 항상 AntD Input 아래에 붙어 있던데 어떤 역할을 하는 코드들 인지 궁금합니다!
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
오류가 있는데 무엇이 문제일까요?
비디오구독에 좋아요를 누른 상태에서 댓글에 싫어요를 누르게 되면 비디오에 있는 좋아요 데이터가 사라집니다. 서버쪽에서 console.log로 넘어가는 데이터를 확인해봤는데 [0] { [0] videoId: '61c280243a1bedecd32d9e36', [0] userId: '61c2df8beed1a65a0f9c5ea6' [0] } [0] { [0] commentId: '61c43a09d692002e6c67d902', [0] userId: '61c2df8beed1a65a0f9c5ea6' [0] } 하나는 비디오 하나는 코멘트로 잘 넘어가고 있는데 여기 코드를 거치면서 videoId 로 넘어간꺼까지 삭제되고 있습니다. 무엇이 문제일까요? const data = { commentId: "61c43a09d692002e6c67d902", userId: "61c2df8beed1a65a0f9c5ea6", }; Like.findOneAndDelete({ data }).exec((err, DisLikeResult) => { if (err) return res.status(400), send(err); res.status(200).json({ success: true, DisLikeResult }); }); 이상황에서 왜 videoId 값을 지닌 데이터가 지워지는지 모르겠습니다.
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
router v6 params 변경점
props.match.params.videoId 가 안먹히는 분들은 최근 나온 라우터버전 v6 를 사용하시는 분들일겁니다. import { useParams } from "react-router-dom"; 임포트 하시고 const videoId = useParams().videoId; 요런 형태로 받으시면 됩니다
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
좋아요 수를 다른 컴포넌트에 보내려면 어떻게 해야하나요?
안녕하세요 강사님 따라하며 배우는 시리즈 이번이 3번째네요~ 다름이 아니라, 강의 수강중 의문이 생겨 글을 남기게 되었습니다. 강의내용에서는 video 스키마 안에 like를 구성하지 않고, like 스키마를 따로 만들었는데요 이렇게 되면 부모, 자식 컴포넌트를 제외한 다른 컴포넌트로 좋아요 개수를 어떻게 전달할 수 있을까요? 한마디로 유튜브 메인페이지처럼 video들의 정보값과 like, view 값들을 가져오고 싶습니다.
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
좋아요 싫어요 숫자 표시 이벤트 코드 문의
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. const onClickDisLike = () => { if (DisLikeAction === null) { Axios.post("/api/like/upDisLike", variable).then((res) => { console.log("onClickDisLike", variable); if (res.data.success) { setDisLikes(DisLikes + 1); setDisLikeAction("liked"); if (LikeAction !== null) { ********************************************* setLikes(Likes - 1); setLikeAction(null); **************************************** 이부분 서버도 같이 실행되야 할거 같은데 맞을까요? } } else { alert("싫어요 클릭이벤트 실패!"); } }); } else { Axios.post("/api/like/unDisLike", variable).then((res) => { if (res.data.success) { setDisLikes(DisLikes - 1); setDisLikeAction(null); } else { alert("싫어요 클릭이벤트 실패!"); } }); } }; 아래 처럼 수정해주어야, 다시 로드했을때 숫자가반영 되서 나오는 것 같아용완성본 github 주소를 못찾아서ㅎㅎ ---------------------------------------------- const unLike = () => { Axios.post("/api/like/unLike", variable).then((res) => { if (res.data.success) { setLikes(Likes - 1); setLikeAction(null); } else { alert("좋아요 클릭이벤트 실패!"); } }); }; const unDisLike = () => { Axios.post("/api/like/unDisLike", variable).then((res) => { if (res.data.success) { setDisLikes(DisLikes - 1); setDisLikeAction(null); } else { alert("싫어요 클릭이벤트 실패!"); } }); }; const onClickLike = () => { if (LikeAction === null) { Axios.post("/api/like/upLike", variable).then((res) => { console.log("onClickLike", variable); if (res.data.success) { setLikes(Likes + 1); setLikeAction("liked"); if (DisLikeAction !== null) { unDisLike(); } } else { alert("좋아요 클릭이벤트 실패!"); } }); } else { unLike(); } }; const onClickDisLike = () => { if (DisLikeAction === null) { Axios.post("/api/like/upDisLike", variable).then((res) => { console.log("onClickDisLike", variable); if (res.data.success) { setDisLikes(DisLikes + 1); setDisLikeAction("liked"); if (LikeAction !== null) { unLike(); } } else { alert("싫어요 클릭이벤트 실패!"); } }); } else { unDisLike(); } };
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
videoId를 variable에 넣지 않은 이유가 무엇인가요??
props.match.params.videoId를 videoId라는 변수에 넣었고 그걸 다시 variable이라는 변수에 넣어서 post요청을 보내는 방식이라고 이해했습니다.(혹시 틀렸다면 알려주세요..!) 그런데 그냥 videoId를 그대로 보내나, variable에 넣어서 보내나 차이점을 모르겠습니다. 요청 보낼때 그냥 videoId를 그대로 쓰면 VideoDetail.writer의 'writer'를 찾을 수 없다는 에러가 뜨는 것은 확인했는데 이유를 알 수 있을까요???
- 미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
로그아웃 기능 구현중인데 DB에 로그인 정보들로 로그인 하는데 로그인이 안됩니다.
DB에 저장된 로그인 정보로 postman을 이용하여 로그인을 계속 시도중인데 로그인 실패가 나옵니다. 무엇이 문제인것 일까요..? ㅠ