수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
express put, delete메서드 사용법이 궁금합니다.
안녕하세요 조현영님. 조현영님께서 http 모듈로 만드신 restServer.js 파일을 제가 express 모듈로 리메이크 하려고 합니다. get과 post메서드는 어떻게든 활용을 할 수 있겠는데 put과 delete를 사용하는게 원리는 어느정도 알겠는데 코드를 어떤식으로 짜야할지 잘 모르겠더라고요. 제가 짠 코드를 보여드리자면 app.put("/user/", (req, res) => { console.log("PUT 본문(body):", req.body); const key = req.url.split("/")[2]; users[key] = req.body.name; res.send(users); }); app.delete("/user/", (req, res) => { const key = req.body.name; delete users[key]; res.send(users); }); 이렇습니다. 사실 조현영님의 restServer.js에서 거의 모방했다시피 짰습니다. 이렇게 짜고 수정 혹은 삭제를 클릭하면 제가 미리 짜뒀던 404처리 미들웨어에 의해서 다음과 같이 표시됩니다. 수정 할 시 Error: 404 at D:\Coding\JavaScript\Node\Node_sever\APIserver\index.js:52:11 at Layer.handle [as handle_request] (D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\index.js:323:13) at D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\index.js:284:7 at Function.process_params (D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\index.js:341:12) at next (D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\index.js:275:10) at serveStatic (D:\Coding\JavaScript\Node\Node_sever\node_modules\serve-static\index.js:75:16) at Layer.handle [as handle_request] (D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\index.js:323:13) at D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\index.js:284:7 삭제 할 시 Error: 404 at D:\Coding\JavaScript\Node\Node_sever\APIserver\index.js:52:11 at Layer.handle [as handle_request] (D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\index.js:323:13) at D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\index.js:284:7 at Function.process_params (D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\index.js:341:12) at next (D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\index.js:275:10) at serveStatic (D:\Coding\JavaScript\Node\Node_sever\node_modules\serve-static\index.js:75:16) at Layer.handle [as handle_request] (D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\index.js:323:13) at D:\Coding\JavaScript\Node\Node_sever\node_modules\express\lib\router\index.js:284:7 둘 다 restFront.js에서 요청을 받아 오지 못한느 거 같습니다. 전체 코드가 필요하시다면 github주소 남겨드리겠습니다. https://github.com/shere1765/small-restAPI
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
import & export / require() 에 대해서
안녕하세요! 정말 node.js를 잘 배우고 있습니다 이론적으로 그래도 부족한 점이 많았구나.. 라는 생각이 들면서 감사함을 느끼면서 보고 있습니다 조금 무지하게도 import export가 require()를 완벽하게 대응하는줄 알고 있었습니다 혹시 간락하게라도 더 배우고 싶은데 제가 참고할만한 자료나 혹시 어떻게 동작이 다른지 설명을 해주실수 있을까요? 너무 광범위한 질문이라면 참고자료라도! 꼭 보고 싶습니다 감사합니다 :)
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
외래키 이름 followingId / followers
일단 하라는대로 하고 제 딴에선 이렇게 정리하였는데, 복습할때 마다 볼때마다 햇갈립니다.제가 놓친부분도 있을거긴 한데, 다시한번 왜 외래키컬럼명과 as별명을 followingId / followers 이렇게 '팔로잉' '팔로워' 다르게 했는지 알려주실수 있나요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
quick 커맨드를 못찾습니다.
devDependencies에도 잘 들어가있고, 버전체크했을때도 깔려있는게 확인이되었습니다. 근데 커맨드가 안대네요
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
블로그 공유 관련..
안녕하세요 강의 잘 듣고있습니다. 혹시 제가 강의를 들은 것을 바탕으로 공부한 내용을 블로그에 정리하고 있는데 여기서 알려주시는 팁 (모듈화, 강의 중간에 나오는 짤막 팁)들을 2차가공해서 개인 블로그에 올려도 될까요? 물론 강의에서만 나용 내용만을 짜집기해서 올린다는 것이 아니라 공식 문서 등도 찾아가면서 정리를 해오고 있습니다. 출처도 남길 예정이구요 ㅎㅎ
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
app.use()와 프로미스 인스턴스의 우선순위
안녕하세요 조현영님 오랜만에 질문올립니다. 제가 모종의 이유로 인해 app.use()를 프로미스 객체를 반환하는 함수랑 같이 쓰기 위해서 다음과 같은 코드를 만들었습니다. (async () => { try { const result = await getNum(); process.nextTick(() => { app.use("/product/product1", product1Router); app.use("/product/product2", product2Router); app.use("/product/product3", product3Router); }); } catch (err) { console.error(err.message); } })(); 일단 app.use("/product/...")를 async/await 구문안에 넣지 않거나 const result = await getNum() 위에 선언하여 사용하면 해당 경로에 get요청을 보낼시 페이지가 잘 나오게 됩니다. 허나 const result = await getNum() 밑에 선언하게 되면 페이지와 콘솔에 제가 만들어 놓았던 404 처리 미들웨어가 실행되며 에러를 뿜습니다 (경로가 인식이 안되는 거 같습니다). await getNum()의 처리가 늦어져서 밑에 있던 app.use()가 실행이 안되는게 아닐까 생각하며 조현영님께서 process.nextTick()을 사용하면 프로미스 객체보다 실행 우선순위를 빠르게 점유 할수 있다는 말씀을 듣고 app.use()를 process.nextTick()으로 감싸버렸습니다. 그런데 프로미스는 비동기 처리이니까 getNum()의 처리가 아무리 늦어져도 밑에 있는 app.use()가 실행이 되어야하는거 아닐까요? 만약에 product1Router역시 async/await으로 감싸져 있다면 문제가 될까요? 혹시 모르니 product1Router 코드도 보여드리겠습니다. (product2Router, product3Router역시 형태는 product1Router와 같습니다.) const express = require("express"); const axios = require("axios"); const router = express.Router(); const showPage = require("../modules/showPage"); router.route("/").get(async (req, res) => { try { const result = await axios.get("http://127.0.0.1:3257"); const productID = String(result.data[0].id); showPage(productID, res); console.log("Request Type:", req.method); } catch (err) { console.error(err); } }); module.exports = router; product1Router역시 async/await으로 감싸져서 process.nextTick()의 효과를 못 받는건가요? 그게 아니라면 어떤 문제가 있을까요? 굳이 process.nextTick()을 이용해서 코드를 짤 필요는 없으니 어떤 이유 때문에 const result = await getNum() 아래에 app.use()를 사용하면 실행이 안되는지 궁금합니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
데이터베이스 모킹 질문드립니다!
User.findOne을 두번하는경우 첫번째는 성공하고 두번째는 실패했을때의 상황을 테스트 하고싶은데 이러한 경우는 어떻게 해야 할까요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
session.js 에서 parse와 querystring
vs code로 실습중입니다. 예제소스를 받아서 실행해보니 parse와 querystring 변수에 취소선이 그어져있는데 이제는 사용이 안되는 문법? 인건가요??
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
미들웨어 사용하기 5:18
강의 잘 듣고 있습니다. res랑 req 변수명은 바꿔도 되지만 의미하는 바는 안 바뀌지 않나요??
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
TypeError: RateLimit is not a constructor
코드는 동일한데, 해당 에러가 나옵니다. const jwt = require('jsonwebtoken'); const RateLimit = require('express-rate-limit'); exports.isLoggedIn = (req, res, next) => { if (req.isAuthenticated()) { next(); } else { res.status(403).send('로그인 필요'); } }; exports.isNotLoggedIn = (req, res, next) => { if (!req.isAuthenticated()) { next(); } else { res.redirect('/'); } }; exports.verifyToken = (req, res, next) => { try { req.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 = new RateLimit({ windowMs: 60 * 1000, // 1분 max: 10, delayMs: 0, handler(req, res) { res.status(this.statusCode).json({ code: this.statusCode, // 기본값 429 message: '1분에 한 번만 요청할 수 있습니다.', }); }, }); exports.deprecated = (req, res) => { res.status(410).json({ code: 410, message: '새로운 버전이 나왔습니다. 새로운 버전을 사용하세요.', }); };
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
require 받는 { } 의 문법적 실체는?
안녕하세요. worker thread 편을 학습하다가 문득 궁금한 것이 있어서 이곳 'module'편에 질문 올립니다. const { odd, even } = require('./var'); 에서 { odd, even }, 이 블럭의 문법적 실체는 무엇인가요? 일단, { even, odd } 와 같이 순서를 바꿔도 정상 실행되는 것을 보니 array는 확실히 아닌 것 같고, 그렇다고 다루는 방법을 보면 set 혹은 object 라고 하기에도 애매합니다. 요소를 단독으로 사용하니 말입니다. 감사합니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
로그인 세션 문의
서버를 재시작 하게되면 로그인이 풀려버리는데 세션이 날아가버리니까 그럼 개발단계에서는 임의로 로그인을 구현만 해놓고 seq.sesssion.id = 'zero' 이런식으로 강제로 넣어놓고 다 구현하고 풀어두나요? 계속 저장할때마다 로그인이 풀려버려서요
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
패스포트 질문드립니다.
패스포트가 헷갈리는데 한가지 질문드립니다. app.js에서 const passportConfig = require('./passport'); 여기서 passport/index.js를 불러오고 passportConfig()로 module.exports된 것을 가져다 쓰는데 함수를 바로싱행하였으니 돌아가는데 passport.serializeUser((user, done) => { done(null, user.id); }); passport.deserializeUser((id, done) => { User.findOne({ where: { id } }) .then(user => done(null, user)) .catch(err => done(err)); }); local(); 함수가 실행되면서 여기서 local도 localStrategy.js에 있는 함수를 loca()이 실행해줍니다. passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password', }, async (email, password, done) => { try { const exUser = await User.findOne({ where: { email } }); if (exUser) { const result = await bcrypt.compare(password, exUser.password); if (result) { done(null, exUser); } else { done(null, false, { message: '비밀번호가 일치하지 않습니다.' }); } } else { done(null, false, { message: '가입되지 않은 회원입니다.' }); } } catch (error) { console.error(error); done(error); } })); 이부분이 auth에서 passport.authenticate에서 찾아간다고 말씀하셨는데 상단에서 local() 할때 아랫부분이 왜 실행이 않되는지 궁금합니다. 로그인한 상태입니다. 이멘트도 get으로 날아가는데 이멘트도 어디에서 보내는지 궁금합니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
화살표 함수의 관해 질문있습니다.
안녕하세요. 제로초님 요즘 왠만한 JS 코드들은 화살표 함수를 안 쓴 코드를 찾아보기가 힘든데요. 그래서 더 의문이 깊어져 갑니다. 화살표 함수가 this 값 때문에 기존 함수를 완전히 대체하지도 못하는데, 구지 화살표 함수를 써야하는 이유가 있나요?? 저는 오히려 너무 간결해져서, 때로는 화살표 함수가 알아보기 힘들 때도 많습니다. 이렇게까지 해가면서, 화살표 함수를 써야되는 이유가 있는지... 그리고 화살표 함수를 써야 할만큼, 코드의 간결함이 실무에는 얼마나 중요한지에 대해서 여줘보고 싶습니다. 아직 코딩 초보인지라, 제가 이해하는데 한계가 있다보니, 본의 아니게 살짝 이상한 질문을 드렸네요. 죄송합니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
passport localstrategy 질문드립니다.
passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password', } 여기서 필드 더 불가능한거죠? id , email 등등 로그인할때는 하나만 체크 가능한거죠? 그리고 이런거 공부할때 passport 에서 try 담에 done은 passport.authenticate('local', (authError, user, info) => { 여기로 간다 이런건 그냥 이해보다는 외워야 하는 부분인거죠?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
findOne 등등 궁금합니다.
예를 들어서 const User = require('../models/user'); 이런식으로 models user 가져와서 사용이 가능한데 맨처음 index.js Comment.init(sequelize); 이부분에서 init 해줘야 하는거 같은데 여기서 해줄떄 그럼 매번 만약 테이블들이 늘어나면 파일을 계속해서 추가시켜주고 init에 맞춰줘야 하는건가요? 안에 필드 늘어나면 계속해서 수정시켜주고요 만약 findOne 이런거 안쓰고 sql로 하게되면 init 할필요도 없는건가요?? 궁금합니다.
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
노드에서 시퀄라이즈 포지션이 어떤가요?
시퀄라이즈가 ORM으로 분류되는거보면 스프링 진영에서의 JPA 같네요. 우리나라에서도 요즘 쿼리문은 작성하지 않을 수 있는 만큼 작성하지 않고 객체 매핑 방식의 ORM으로 많이 넘어가는 걸로 알고 있습니다. 질문리스트에서 언급하신 prisma2 도 ORM 인데, 시퀄라이즈와 prisma2 중에 요즘은 어느것이 주류인지 알고싶어 질문드렸습니다. 어차피 지원하고자 하는 회사에 기술스택을 맞출거지만 궁금하네요
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
app.use와 req.url
안녕하세요 조현영님 이번에는 req.url과 app.use의 관계에 대해서 질문해봅니다. app.use("/test", (req, res, next) => { if (req.method === "GET") { console.log(`${req.url} 디렉터리에 ${req.method}요청이 들어왔습니다!`); next(); } else if (req.method === "POST") { console.log(`${req.url} 디렉터리에 ${req.method}요청이 들어왔습니다!`); next(); } else if (req.method === "PUT") { console.log(`${req.url} 디렉터리에 ${req.method}요청이 들어왔습니다!`); next(); } }); app.route("/test") .get((req, res) => { res.send("Hello get request!"); console.log(req.url); }) .post((req, res) => { res.send("Hello post request!"); console.log(req.url); }) .put((req, res) => { res.send("Hello put request!"); console.log(req.url); }); app.use("/test", ...) 미들웨어로 "/test" 요청이 발생할 때마다 req.url , req.method 객체를 사용해서 요청받은 주소 그리고 요청 메서드 형태를 출력하는 분기문을 만들었습니다. 그리고 밑에는 app.route("/test", ...) 미들웨어로 "/test"에 대한 get,post,put 메서드를 나누었습니다. 그런데 app.use()에서 req.url을 출력할때 /test가 아닌 /가 출력됩니다. /test로 출력하게 하려면 어떻게 해야 하나요?
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
404 처리 미들웨어 next 질문
안녕하세요. 궁금한 게 하나 있습니다. 미들웨어에서 next를 해 주지 않으면 다음 라우터로 넘어가지 않는다고 알아들었는데, 강사님의 404 처리 미들웨어를 보면 next();를 하지 않으셨더라고요. 혹시 404 아래로 더 이상 실행될 라우터가 없기 때문에 생략하신 건가요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
세션 질문드립니다.
여기서 req.login(); req.logout(); 을 쓸수있는것은 패스포트 안에있는 기능인가요? express-session 도 깔아두었는데 passport.serializeUser 이부분이 실행하고 done()이 실행할때 req.session.id = user.id 랑 같다고 생각할수있나요? 근데 만약 위에꺼가 실행되는거라면 req가 들어있지 않는데 어떻게 실행이 되는지 궁금합니다.