묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Node.js 노드 빠르게 훑어보기: 서버부터 DB까지
글 작성 페이지 강의는 없는건가요?
글작성 페이지를 작성한부분이 누락된것같습니다. write.html 도 올려주시면 안될까요?
-
미해결Node.js 노드 빠르게 훑어보기: 서버부터 DB까지
전체 코드가 업로드된 곳이 있나요?
전체 코드가 업로드되어있는 깃허브 레포지토리 등이 있나요? 혹시 제가 못찾고 있는 거라면 알려주시면 감사하겠습니다.
-
미해결Node.js 노드 빠르게 훑어보기: 서버부터 DB까지
[2] 섹션4 강의 누락
섹션4 'MongoDB로 CRUD 구현하기'에서 'Datail 상세 페이지'와 'Delete 삭제' 강의 사이의 Edit 관련 강의가 누락되어있습니다. 빠른 확인 바랍니다.
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
7.5 시퀄라이즈
안녕하세요 선생님 시퀄라이즈 강의를 듣는데 raw쿼리를 쓰는게 가능하더군요. spring + ibatis 로 주로 개발해와서 raw 쿼리가 익숙한데 실무에서는 시퀄라이즈 vs raw 쿼리 중에 어떤걸 많이 사용하는 편인가요..?
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
Premium 문의…!
선생님 어제 코드 감사합니다 아쉽게도 많이 배워야할것같아서 ㅠㅜ 혹시 제가 빠트린 코드가 있을까요 ? 아니면 다른부분 확인할 사항이 있을까요? 작성한 코드 올려드립니다nodebird-api -> middlewares-> index.jsconst jwt = require("jsonwebtoken"); //토큰을 검사하는 미들웨어 const rateLimit = require("express-rate-limit"); const User = require("../models/user"); const { Domain } = require("../models/"); const cors = require("cors"); exports.isLoggedIn = (req, res, next) => { if (req.isAuthenticated()) { next(); } else { res.status(403).send("로그인 필요"); } }; exports.isNotLoggedIn = (req, res, next) => { if (!req.isAuthenticated()) { // 패스포트 통해서 로그인 안했으면 next(); } else { const message = encodeURIComponent("로그인한 상태입니다."); res.redirect(`/?error=${message}`); //localhost:8001? error=메시지 } }; //토근검사 exports.verifyToken = (req, res, next) => { try { res.locals.decoded = jwt.verify( req.headers.authorization, process.env.JWT_SECRET ); return next(); } catch (error) { if (error.name === "TokenExpiredError") { return res.status(419).json({ code: 419, message: "토큰이 만료되었습니다.", }); } return res.status(401).json({ code: 401, message: "유효하지 않은 토큰입니다.", }); } }; const limiter = rateLimit({ widowMs: 60 * 1000, max: (req, res) => { if (req.user?.Domains[0]?.type === "premium") { return 10; } return 1; }, handler(req, res) { res.status(this.statusCode).json({ code: this.statusCode, message: `1분에 ${ req.user?.Domains[0]?.type === "premium" ? "열" : "한" } 번만 요청 할 수 있습니다...`, }); }, }); exports.apiLimiter = async (req, res, next) => { let user; if (res.locals.decoded) { user = await User.findOne({ where: { id: res.locals.decoded.id }, include: { model: Domain }, }); } req.user = user; limiter(req, res, next); }; exports.deprecated = (req, res) => { res.status(410).json({ code: 410, message: "새로운 버전이 나왔습니다. 새로운 버전을 사용하세요", }); }; exports.corsWhenDomainMatches = async (req, res, next) => { const domain = await Domain.findOne({ where: { host: new URL(req.get("origin")).host }, }); if (domain) { cors({ origin: true, Credential: true, })(req, res, next); //미들웨어 확장패턴 } else { next(); } }; nodebird-api -> routes -> v2.jsconst express = require("express"); const { verifyToken, apiLimiter, corsWhenDomainMatches, } = require("../middlewares"); const { createToken, tokenTest, getMyPosts, getPostsByHashtag, } = require("../controllers/v2"); const cors = require("cors"); const router = express.Router(); router.use(corsWhenDomainMatches); router.use( cors({ origin: true, credentials: true, //쿠키요청 }) ); router.post("/token", apiLimiter, createToken); router.get("/test", verifyToken, apiLimiter, tokenTest); router.get("/posts/my", verifyToken, apiLimiter, getMyPosts); // GET /v2/posts/hashtag/:title router.get("/posts/hashtag/:title", verifyToken, apiLimiter, getPostsByHashtag); module.exports = router;
-
해결됨mongoDB 기초부터 실무까지(feat. Node.js)
comment의 id가 생성되는 시점
선생님 안녕하세요. 강의 정말 잘듣고 있습니다. 감사드립니다.강의를 보다가 궁금한 점이 생겼는데요. 블로그에 코멘트를 넣을 때, 이렇게 했는데,const comment = new Comment({ content, user, blog }); await Promise.all([ comment.save(), Blog.updateOne({ _id: blogId }, { $push: { comments: comment } }), ]);저는 처음에 이걸 보고 comment 콜렉션에 들어가는 다큐먼트와 blog에 들어가는 comment의 Id 가 다를 거라고 생각했어요. comment의 id는 디비에 직접 삽입 된 후에 반환될 거라고 생각했습니다. 그래서 promise.all을 이용해 한번에 처리하는 게 아니라, 순차적으로 await을 붙여서 해줘야 한다고 생각했었는데요. 그런데 결과를 보니 comment의 id와 블로그에 들어가 있는 comment의 id가 같더라구요. 정말 신기했습니다. 그래서 궁금한게, comment의 id는const comment = new Comment({ content, user, blog });이 시점에서 생성되는 건가요? 아니면 다른 뭔가가 있을까요?? 궁금합니다~
-
미해결MERN STACK 커뮤니티 : 시작부터 배포까지 알려주는 React
콘솔에 DOM이라는 로그가 뜨는데
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 에러코드도 아닌데 왜 뜰까요??제가 console.log로 한것도 아닌데 안뜨게 할 수 없을까요?
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
Material Theme 테마 관련해서 질문 드립니다.
똑같이 설치 했는데 왜 저는 강사님 처럼데코레이터는 파란색함수명은 빨간색으로 하고 싶은데저는 이 2개가 같이 바뀌네요 ? ㅠ 스코프를 아래와 같이 설정하면, 데코랑 함수명이 같이 움직입니다. 따로 셋팅은 힘든 걸가요?"scope": ["entity.name.function"], "settings": { "foreground": "#FFFF00" }
-
미해결Node.js 노드 빠르게 훑어보기: 서버부터 DB까지
datail 페이지 작성하는 부분은 강의에 없는건가요??
확인 부탁드립니다!
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
10.6 재질문…!
exports.apiLimiter = async (req, res, next) => { let user; if (res.locals.decoded) { user = await User.findOne({ where: { id: res.locals.decoded.id } }); } rateLimit({ widowMs: 60 * 1000, max: user?.type === "premium" ? 10 : 1, handler(req, res) { res.status(this.statusCode).json({ code: this.statusCode, message: "1분에 열 번만 요청 할 수 있습니다...", }); }, })(req, res, next); }; Api 프리미엄고객만 1분에 열번만요청할수있게 미들웨어 확장패턴으로만들었습니다 그런데 localhost:4000/myposts 접속해서 10 번이상새로고침해도 api가 제한이 안되고 제가작성한 게시글 목록만 뜹니다
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
10.6 사용량 제한 질문
nodebird-api 미들웨어 index.js 타입이 any로 떠서 프리미엄이 체크가 안되고 계속 제가 작성한 게시글정보만 뜹니다 사용량제한 어떻게 하나요? ㅠㅠ const jwt = require("jsonwebtoken"); const rateLimit = require("express-rate-limit"); const User = require("../models/user"); exports.isLoggedIn = (req, res, next) => { if (req.isAuthenticated()) { next(); } else { res.status(403).send("로그인 필요"); } }; exports.isNotLoggedIn = (req, res, next) => { if (!req.isAuthenticated()) { next(); } else { const message = encodeURIComponent("로그인한 상태입니다."); res.redirect(`/?error=${message}`); } }; exports.verifyToken = (req, res, next) => { try { res.locals.decoded = jwt.verify( req.headers.authorization, process.env.JWT_SECRET ); return next(); } catch (error) { if (error.name === "TokenExpiredError") { return res.status(419).json({ code: 419, message: "토큰이 만료되었습니다.", }); } return res.status(401).json({ code: 401, message: "유효하지 않은 토큰입니다.", }); } }; exports.apiLimiter = rateLimit({ windowMs: 60 * 1000, // 1분 max: 1, handler(req, res) { res.status(this.statusCode).json({ code: this.statusCode, // 기본값 429 message: "1분에 한 번만 요청할 수 있습니다.", }); }, }); exports.apiLimiter = async (req, res, next) => { let user; if (res.locals.decoded) { user = await User.findOne({ where: { id: res.locals.decoded.id } }); } rateLimit({ widowMs: 60 * 1000, max: user?.type === "premium" ? 10 : 1, handler(req, res) { res.status(this.statusCode).json({ code: this.statusCode, message: "1분에 열 번만 요청 할 수 있습니다...", }); }, })(req, res, next); }; exports.deprecated = (req, res) => { res.status(410).json({ code: 410, message: "새로운 버전이 나왔습니다. 새로운 버전을 사용하세요", }); };
-
미해결[웹 개발 풀스택 코스] Node.js 프로젝트 투입 일주일 전 - 기초에서 실무까지
현재 mysql 연동하기 강의를 듣고 있는데, ..
안녕하세요.현재 mysql 연동하기 강의를 듣고 있는데, sql 워크벤치에서 어떻게 칼럼을 넣어야 하는지 알수있을까요?
-
해결됨mongoDB 기초부터 실무까지(feat. Node.js)
리팩토링 강의에서 라우터 리팩토링 전개연산자(...)
선생님 안녕하세요. 좋은강의 정말로 감사드립니다.리팩토링 강의에서 라우터들을 Index.js로 통합시켜줄 때 module.exports = { ...require("./userRouter"), ...require("./blogRouter"), ...require("./commentRouter"), }; 이렇게 전개연산자(...)를 작성해주셨는데요. 이유가 뭘까요? 이렇게 안하고 그냥 module.exports = { require("./userRouter"), require("./blogRouter"), require("./commentRouter"), }; 이렇게 해주려고 하니 에러가 발생하더라구요. 이유가 뭘까요??
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 영화 사이트 만들기
504 Gateway Timeout Error
저같은 경우는 오타 문제였습니다ㅠㅠ 비슷한 질문들 보이는데 서버 에러로그 잘 살펴보세요보면 ReferenceError에 falase라고 false 오타여서 오류났었어요
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
10.6 사용량 제한 구현하기파트 질문
nodebird-api 미들웨어 index.js코드 const jwt = require("jsonwebtoken"); const rateLimit = require("express-rate-limit"); const User = require("../models/user"); exports.isLoggedIn = (req, res, next) => { if (req.isAuthenticated()) { next(); } else { res.status(403).send("로그인 필요"); } }; exports.isNotLoggedIn = (req, res, next) => { if (!req.isAuthenticated()) { next(); } else { const message = encodeURIComponent("로그인한 상태입니다."); res.redirect(`/?error=${message}`); } }; exports.verifyToken = (req, res, next) => { try { res.locals.decoded = jwt.verify( req.headers.authorization, process.env.JWT_SECRET ); return next(); } catch (error) { if (error.name === "TokenExpiredError") { return res.status(419).json({ code: 419, message: "토큰이 만료되었습니다.", }); } return res.status(401).json({ code: 401, message: "유효하지 않은 토큰입니다.", }); } }; exports.apiLimiter = async (req, res, next) => { let user; if (res.locals.decoded) { user = await User.findOne({ where: { id: res.locals.decoded.id } }); } rateLimit({ windowMs: 60 * 1000, max: user?.type === "premium" ? 1000 : 10, handler(req, res) { res.status(this.statusCode).json({ code: this.statusCode, message: "1분에 열 번만 요청할 수 있습니다.", }); }, }); }; exports.deprecated = (req, res) => { res.status(410).json({ code: 410, message: "새로운 버전이 나왔습니다. 새로운 버전을 사용하세요", }); }; nodebird-api routes v2.js 코드 const express = require("express"); const { verifyToken, apiLimiter } = require("../middlewares"); const { createToken, tokenTest, getMyPosts, getPostsByHashtag, } = require("../controllers/v2"); const router = express.Router(); router.post("/token", apiLimiter, createToken); router.get("/test", verifyToken, apiLimiter, tokenTest); router.get("/posts/my", verifyToken, apiLimiter, getMyPosts); router.get("/posts/hashtag/:title", verifyToken, apiLimiter, getPostsByHashtag); module.exports = router; 프리미엄으로 클라이언트 비밀키 발급하고 프리미엄만 사용량제한 구현했는데 터미널에 GET/search/%EA%B3%A0%EC%96%91%EC%9D%B4 - - ms - - 이렇게 나오고 사이트로딩만 뜹니다 ㅜㅜ
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
화살표 함수 자동완성이 궁금합니다
안녕하세요 선생님강의를 보다보니 그림판에서 텍스트로 코딩을 하시는데 화살표함수 작성시 뒤에 구문이 자동으로 입력이 되던데 그림판에 어떤 플러그인을 설치하셨길래 이런 기능이 되는건지 궁금합니다.
-
미해결MERN STACK 커뮤니티 : 시작부터 배포까지 알려주는 React
useEffect 두번 사용하는 것
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.두번사용한 이유가axios요청을하고 setPostInfo로 데이터를 저장했지만화면은 렌더링이 끝난 뒤니까 데이터는 가져왔지만화면에는 안띄워져서 useEffect를 두번 사용하신게 맞나요?? 첫번째 useEffect에서 서버 요청후에 만약 PostInfo 데이터가 변한다면 두번째 useEffect가 실행되어 렌더링되므로 데이터를 화면에 띄울 수 있게 되는 것이다.제가 이해한게 맞을까요?? 그렇다면 아래와 같이 처음 useEffect에 PostInfo를 중괄호에 넣으면 왜 안되는지 알 수 있을 까요??넣으니까 서버에 무한 요청만하고 데이터를 화면에 못띄우네요..ㅠㅠ 제가 이해를 잘한 건지 알려주시면 감사드리겠습니다!
-
미해결MERN STACK 커뮤니티 : 시작부터 배포까지 알려주는 React
작동은 잘되는데 오류가 뜹니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 검색해보니 undefined가 우려되어 그렇다는데이렇게 바꾸니 괜찮아졌습니다.강의에안나와있는데 괜찮을까요??
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
[8.2] 몽고디비 설치 중 ECONNREFUSED 127.0.0.1:27017 오류 발생
안녕하세요, Mac (M2 pro) mongoDB 설치 중 오류가 발생하여 질문 드립니다.brew install 통해서 mongodb-community, mongosh 설치하였고, 관리자 계정 생성 및 인증 설정까지는 문제 없었다가생성한 관리자 계정으로 접속하려 하니 오류가 발생했습니다.$ mongosh admin -u [이름] -p [비밀번호] Current Mongosh Log ID: 649446c2b1a5e49aba3e9a36 Connecting to: mongodb://<credentials>@127.0.0.1:27017/admin?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.10.1 MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017설치에 오류가 있나 싶어서 uninstall 후 재설치를 했을 때는 mongosh 만 입력해도 아래와 같은 오류 메세지가 발생했습니다.$ mongosh Current Mongosh Log ID: 64944aeec3f1dc59c1744436 Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.10.1 MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017 5버전으로도 설치해봤는데도.. 동일하게 오류가 자꾸 발생하네요ㅠ 이유를 모르겠습니다....
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 쇼핑몰 사이트 만들기[전체 리뉴얼]
[login route 생성하기] - accessToken에 userData를 담은 이유가 궁금합니다.
안녕하세요. login route 생성하기의 내용을 쭉 따라가다가 이해가 되지 않는 부분이 있어 질문하게 되었습니다.강사님께서는 노드 백엔드서버에서 accessToken와 userData를 담은 객체를 json형식으로 반환하도록 하셨습니다. 저로써는 db에 저장되어 있는 회원객체를 그대로 인증정보에 담는 것이 매우 위험하다고 생각되었습니다. userData를 반환해준 이유가 궁금합니다.