묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
userMiddleware와 authMiddleware를 언제 언제 넣어주는지 헷갈리네요.
제가 코드를 이해한걸로는 userMiddleware는 클라이언트에서 보낸 token의 쿠키에 jwt를 이용하여 해당 user를 찾고 res.locals.user에 글로벌하게 담는 역할을 하는것 같고,authMiddleware는 res.locals.user가 존재 하는지 체크 하는것 같은데언제 언제 사용하고 사용 하지 말아야 할지 도통 감이 안잡히네요 ㅠ
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
포트폴리오 리뷰 - container/presenter 파일 분리 레이아웃 깨짐 문제
포트폴리오 리뷰 - container/presenter 파일 분리레퍼런스 코드를 클론후 빌드했을때http://localhost:3000/boards 페이지 접근시우측 날짜 시간쪽이 겹쳐서 나오는 것 같습니다.단순 CSS 문제라고 보면 되나요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
파이어베이스 vs AWS
배포에서 대표적인 클라우드 서비스로 AWS, GCP, Azure 를 알려주셨는데요혹시 파이어베이스도 같은 묶음으로 봐도 될까요?? 파이어베이스는 AWS처럼 사용할 수 없나요??파이어베이스는 DB, 서버 용으로만 배우는게 좋을까요??
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
context 질문 있습니다.
안녕하세요export const AuthProvider = ({ children }: { children: React.ReactNode }) => {}에서 ({ children }: { children: React.ReactNode }) 질문입니다.뒤에 타입 부분이 헷갈리는데, ({ children }: { children: React.ReactNode }) 하지 않고 ({ children }: React.Node} 이렇게 하면 왜 안되는건가요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
CreateBoardComment
안녕하세요 createBoardComment 만들려고 mutation CreateBoardCommet doc을 보고 하고 있는데createBoardCommentInput과 boardId:ID! 를 두개다 써야되는데 어떻게 해야 되는지 알수 있을까요? 또한 밑에 createBoardComment도 필요하다 하는데 어떻게 써야되는건가요?감사합니다
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
안녕하세요 server에서 res.json과 res.send에 대해 궁금하네요
보통 항상 프론트엔드에 보낼때 res.json으로 보내었는데 이번에는 res.send를 사용 하였는데 2개가 차이가 있을까요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
Aws관련질문
강좌에서 aws 인스턴스를 2개를 사용해 프론트서버와 백엔드서버를 배포한것과는 다르게 프리티어 인스턴스 한개로 두개의 서버를 배포하려하는데 aws 서버 메모리가 부족할까요?
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
안녕하세요.
안녕하세요.현재 새로 나온 노드 교과서 이북과 현영님께서 주신 현물 책도 가지고 있는 상황에서 공부를 시작하려고 하는데 강의 결제 후 같이 보는건 어떨까요??공부하는데 돈은 아끼면 안된다고 생각하는 편이라 학습 효율이 가장 중요합니다. 예전에 유튜브로 하나만 구매하면 된다곤 하셨는데 둘 다 병행하면서 보면 어떨지 궁금합니다. 그리고 만약 하나를 선택 한다면 책, 강좌 중 뭐가 더 괜찮을지 혹은 개인의 성향 차이일지도 궁금합니다.항상 좋은 강좌 감사합니다.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
프론트에서 useSWR로 받아온 data 콘솔로그로
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 이걸 백엔드부분에서 콘솔로그를 출력안하고프론트에서 로그출력하는 법은 없을까요??백엔드에서말고 프론트에서도 받아온 데이터 보고싶은데 콘솔로그하면 데이터가 안뜨고, undefined만 떠서요..
-
미해결만들면서 배우는 프론트엔드 DO IT 코딩 (Next.js, Typescript)
메세지 목록 API 페이지네이션 처리 중 막혀서 질문드립니다.
안녕하세요. 매 회차마다 선생님 코딩 실력에 감탄하며 강의 듣고 있습니다. 지금 페이지네이션 API 만들고 썬더 클라이언트에서도 문제 없이 작동했는데 view 부분에서 setMessageList((prev) => [...prev, ...data.content]);로 바꾸고 나서 처음 화면이 로드되면 API 호출이 두번 되면서 messageList에 데이터가 두번 저장됩니다. 그 이후 더보기 버튼 클릭시에는 size만큼 잘 불러오는데 처음 페이지 로딩때만 두번 나오는 이유를 모르겠습니다. useEffect 부분도 useEffect(() => { if (userInfo === null) return; fetchMessageList(userInfo.uid); }, [userInfo, messageListFetchtrigger, page]); 로 선생님 작성한 코드와 같은 것 같은데 틀린부분 있을까요?React Hook useEffect has a missing dependency: 'fetchMessageList'. Either include it or remove the dependency array.이런 eslint 경고도 나옵니다.강의 계속 돌려보다가 도저히 모르겠어서 질문 남깁니다 ㅠ - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
수업질문 Unhandle Runtime Error해결 방법 문의드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.인덱스와 유저페이지만 안들어가지고 다른 페이지들은 들어가집니다. 구글링 해봐도 해결을 못해서 질문남겨봅니다.혹시 어느 부분이 문제인지 알수 있을까요? 터미널 오류warn - Fast Refresh had to perform a full reload. Read more: https://nextjs.org/docs/messages/fast-refresh-reloadstate { user: null, authenticated: false, loading: true }upstream image response failed for http://localhost:4000/images/qTXQHCjdvd.jpg 404ImageError: "url" parameter is valid but upstream response is invalid at imageOptimizer (/Users/camoma1/Desktop/reddit-clone-app/client/node_modules/next/dist/server/image-optimizer.js:476:19) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async cacheEntry.imageResponseCache.get.incrementalCache (/Users/camoma1/Desktop/reddit-clone-app/client/node_modules/next/dist/server/next-server.js:264:72) at async /Users/camoma1/Desktop/reddit-clone-app/client/node_modules/next/dist/server/response-cache/index.js:83:36 { statusCode: 404}런타임 에러Unhandled Runtime ErrorError: Image with src "http://localhost:4000/images/qTXQHCjdvd.jpg" is missing required "width" property.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
Intersection observer에서
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.두 가지 질문이 있는데 답변해주시면 정말 감사드립니다.ㅠㅠㅠentrise[0] 이 뜻하는건 뭔지 알 수 있을 까요??아래에서 인수로 마지막 Post의 element를 설정했는데 그걸 의미하는건가요??위에서 setPage(page+1)을 하면 아래에서setPage가 +1이 돼서page가 +1이 되고, getkey의 pageIndex가 page값으로 돼서/posts?page=${pageIndex} 가 호출 되는 건가요??const page 가 getkey의 pageIndex인건가요??
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
Credentials 설정 후 origin: true를 줘도 헤더 결과값이 안들어가요
안녕하세요!Credentials 설정 후 origin을 'http://localhost:3060' 으로도, true 로도 변경해봤지만 계속해서 해당 오류가 뜨는데 이유를 모르겠습니다. ㅠㅠ 제로초님의 오류와 다른 부분이 있는 것 같습니다.Access to XMLHttpRequest at 'http://localhost:3065/user/login' from origin 'http://localhost:3060' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be 'true' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.제 코드는 현재 이렇습니다.[app.js]const express = require("express"); const session = require("express-session"); const cookieParser = require("cookie-parser"); const cors = require("cors"); const passport = require("passport"); const dotenv = require("dotenv"); const postRouter = require("./routes/post"); const userRouter = require("./routes/user"); const db = require("./models"); const passportConfig = require("./passport"); const app = express(); dotenv.config(); passportConfig(); //서버 실행할 때 db sequelize 연결도 함께 실행 db.sequelize .sync() .then(() => { console.log("db 연결 성공"); }) .catch(console.error); // router보다 위에 작성해야 함 app.use( cors({ // origin: 'https://nodebird.com' // 설정된 웹페이지에서 오는 요청만 허용 // origin: "*" // 전체 허용 // origin: "http://localhost:3060", // withCredential: true 일 때 보안이 더 철저해져서 정확한 주소를 적어야 함 origin: true, // 요청을 보낸 곳의 주소가 자동으로 들어가 허용 credientials: true, }) ); // CORS 에러 처리법 2 (npm i cors) app.use(express.json()); // front에서 json형식으로 데이터를 보냈을 때 json형식의 데이터를 req.body로 넣어줌 app.use(express.urlencoded({ extended: true })); // form을 submit했을 때 urlencoded 방식으로 데이터가 넘어옴 app.use(cookieParser(process.env.COOKIE_SECRET)); app.use( session({ saveUninitialized: false, resave: false, secret: process.env.COOKIE_SECRET, }) ); app.use(passport.initialize()); app.use(passport.session()); app.get("/", (req, res) => { res.send("hello express"); }); app.get("/posts", (req, res) => { res.json([ { id: 1, content: "hello1" }, { id: 2, content: "hello2" }, { id: 3, content: "hello3" }, ]); }); app.use("/post", postRouter); app.use("/user", userRouter); app.listen(3065, () => { console.log("서버 실행중!!!!"); }); [sagas - index.js]import axios from "axios"; import { all, fork } from "redux-saga/effects"; // take 는 1회용이기 때문에 while(true) {} 문으로 감싸준다. 하지만 직관적이지 않으므로 take 대신에 takeEvery를 사용한다. // takeLatest 는 클릭이 두번되었을 때 두 번 실행되지 않기 위해 마지막 것만 실행되도록 하는 effect 이다. (요청은 취소되지 않고 응답만 취소되므로 서버에는 두개가 저장됨(치명적단점)) // takeLeading 은 첫번째 것만 실행되도록 하는 effect 이다. // throttle 은 시간제한을 두어 그 시간동안에 한번만 실행되도록 요청하는 것이다. (특수한 경우에 사용, 디도스 공격을 막을 때 좋음) import userSaga from "./user"; import postSaga from "./post"; axios.defaults.baseURL = "http://localhost:3065"; axios.defaults.withCredentials = true; // function* : generator 는 yield(중단점)가 있는 곳에서 멈춤 export default function* rootSaga() { // all 은 fork 나 call 을 동시에 실행시켜준다. yield all([ // fork !== call // fork 는 비동기 함수 호출 , call 은 동기 함수 호출 fork(userSaga), fork(postSaga), ]); } 어디서 잘못된 걸까요..? 오류를 보면 header in the response is '' 로 헤더의 결과 값이 없는 것같은데...origin 을 true 로 변경했는데 왜 안들어갈까요...
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
HOC 강의 시청 후 응용? 질문
안녕하세요 멘토님.항상 좋은 강의 잘 보고 있습니다. HOC와 권한분기 실습 까지 수강을 마치고 궁금한 점이 생겨 질문 드립니다.페이지로 이동 시 HOC를 먼저 실행하여 로그인을 체크하는 방식은 이해했습니다.그런데, 간혹 어떤 특정 게시판 사이트에 비로그인 상태에서 댓글 작성을 한다고 가정할 때인풋창이나 등록 버튼을 누르면 '로그인 후 이용해주세요' 라는 알럿을 띄워주는 경우가 있습니다. (페이지 이동이 아닌 단순 엘리먼트 클릭)이러한 경우에는 그냥 단순히 인풋이나 등록 버튼 등 엘리먼트를 클릭 했을 때 토큰이 있는지 if 검증을 하는 로직만 넣으면 되는 것인지 궁금합니다.그리고 댓글 리스트 수정과 같은 상황에서 댓글 리스트에서 댓글 하나를 수정 버튼 눌렀을 때, 비로그인 유저를 감지하여 알럿을 띄워주고 싶은 경우도 궁금합니다. 이런 경우는 보통 이전 수업 때 배웠듯이 map을 사용하여 댓글 수정 컴포넌트를 반복문으로 뿌려주는 형태로 사용을 합니다. 그렇다면 이 댓글 수정 컴포넌트를 export 하는 과정에서 HOC를 씌워주는게 맞는 것인지, 아니면 그냥 또 단순히 수정 버튼 클릭 시 if 검증을 통해 토큰 존재 여부만 파악하면 되는지 궁금합니다. 감사합니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
react-query 관련
노드버드 깃허브 코드를 봤습니다 redux-saga와 redux 툴킷을 사용하신 프로젝트에서는 getServersideProps를 주로 쓰시고 react-query에서는 getstaticProps를 쓰셨던데 어째서 이런 차이가 있는건지 궁금합니다
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
파이어베이스에서 업데이트 및 삭제
파이어베이스에서 업데이트나 삭제를 할때 그 문서의 id?(위의 사진의 글자)를 가져와서 변경을 해줘야하잖아요그런데 저 id를 어떻게 데이터와 함께 가져오는거죠..? const [boardsData, setBoardsData] = useState<DocumentData[]>([]); const [boardId, setBoardId] = useState<string[]>([]); const onClickShowBoards = async () => { const myBoard = collection(getFirestore(firebaseApp), "MyBoard"); const result = await getDocs(myBoard); const data = result.docs.map((el) => el.data()); setBoardsData(data); const dataId = result.docs.map((el) => el.id); setBoardId(dataId); }; 위와같이 배열을 생성해서 각각의 아이디를 불러오긴했는데 어떻게 연결시킬지 모르겠네요ㅜ
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
aws ec2 관련
강좌에서는 backend 서버와 프론트 서버를 인스턴스를 2개를 사용해서 배포하는데혹시 인스턴스 1개에서 둘다 배포하는건 불가능한건가요? 가능하다면 어떤식으로 해야할까요?
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
s3 관련 aws-sdk 오류 질문
안녕하세요 선생님.일단 우분투에서 백서버 실행을 하면 sudo npx pm2 reload all Use --update-env to update environment variables [PM2] Applying action reloadProcessId on app [all](ids: [ 0 ]) [PM2] [app](0) ✓이렇게 실행은 되는데 주소로 접근하면 자꾸 에러가 나서 로그를 보니까/root/.pm2/logs/app-error.log last 15 lines: 0|app | at Module._compile (internal/modules/cjs/loader.js:1114:14) 0|app | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1143:10) 0|app | at Module.load (internal/modules/cjs/loader.js:979:32) 0|app | at Function.Module._load (internal/modules/cjs/loader.js:819:12) 0|app | code: 'MODULE_NOT_FOUND', 0|app | requireStack: [ 0|app | '/home/ubuntu/My-Projects/fourthProject/back/node_modules/@aws-sdk/lib-storage/dist-cjs/Upload.js', 0|app | '/home/ubuntu/My-Projects/fourthProject/back/node_modules/@aws-sdk/lib-storage/dist-cjs/index.js', 0|app | '/home/ubuntu/My-Projects/fourthProject/back/node_modules/multer-s3/index.js', 0|app | '/home/ubuntu/My-Projects/fourthProject/back/routes/post.js', 0|app | '/home/ubuntu/My-Projects/fourthProject/back/app.js' 0|app | ] 0|app | }이렇게 나오는데, 이건 routes/post.js 에서 aws-sdk를 적용한 뒤에 나온 에러라서 이 부근이 문제인건 알겠지만 어디를 봐야할지 모르겠어서 질문 드립니다. const multerS3 = require('multer-s3'); const AWS = require('aws-sdk'); AWS.config.update({ accessKeyId: process.env.S3_ACCESS_KEY_ID, secretAccessKey: process.env.S3_SECRET_ACCESS_KEY, region: 'ap-northeast-2', }); const upload = multer({ storage: multerS3({ s3: new AWS.S3(), bucket: 'fashionary-s3', key(req, file, cb){ cb(null, `original/${Date.now()}_${path.basename(file.originalname)}`) } }), limits: {fileSize: 20 * 1024 * 1024} //20MB }) router.post('/images', isLoggedIn, upload.array('image'), async(req, res, next) => { console.log("req.files:::::::" + req.files); res.json(req.files.map((v) => v.location)); });문제의 코드는 위와 같은데,버켓명도 일치하고, 리전도 서울(아시아 태평양(서울) ap-northeast-2)이고vim .env해서 S3_ACCESS_KEY_ID와 S3_SECRET_ACCESS_KEY도 넣고,(cat .env로 확인하였습니다)npm uninstall multer-s3 aws-sdk 후, npm install multer-s3 aws-sdk 도 해보았는데같은 에러가 떠요. 어디를 봐야 하나요 선생님..?
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
isLargeRow에 관한 질문입니다.
강의 열심히 듣고 있습니다.Row.js에서 사용하고 있는 isLargeRow에 관해 질문드립니다. isLargeRow는 부모 컴포넌트에서 boolean값을 설정하지 않고 단지 문자열로 props로 보내지는데 Rows.js에서는 true 값을 가지게 되는게 잘 이해가 안가네요props로 문자열을 내려주면 자식 컴포넌트에서는 그 문자열이 내려오면 true로 없으면 false로 인식을 하는건가요?바쁘시겠지만 답변 부탁 드리겠습니다.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
리덕스 관련 코드는 없을까요??
채용공고에서 많이들 리덕스 사용 경험을 물어서 리덕스로 해보고 싶은데 리덕스와 타입스크립트를 연계하는게 어려워보여서 혹시 관련 소스코드는 없을지 궁금하여 여쭤봅니다. 이 부분이 공부하기가 어렵네요.