수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
안녕하세요 express-session, cookie-parser 에대한 질문이 있습니다.
안녕하세요 제로초님 제가 제로초님 노드 교과서랑 강의를 구매해 공부 중에 있는데 처음에 너무 어려워서 중도 포기를 했다가 마음을 다잡고 다시 열심히 달려보려 하는 한 학생입니다. 설명을 쉽게 잘해주시는데 처음 접해보는 것이 너무 많아 이해가 조금 어렵더라고요ㅠㅠ 그래서 공부 중 6장의 cookie-parser와 express-session에 대한 궁금증이 있어 이렇게 글을 남기게 되었습니다. 1. 기존 사용자에 경우 브라우저가 사용자의 정보를 알고 있는데 어떤 식으로 express-session과 cookie-parser를 사용해 브라우저가 기억하고 있는 건지 과정이 궁금합니다. 로그인할 때마다 cookie를 새로 생성하나요? 2. cookie를 생성하고 console.log(req.session)을 확인했는데 Session { cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true, secure: true } } cookie에는 cookie에 대한 정보가 없습니다.
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
컨트롤러에서 multer 사용 질문
안녕하세요. 매일 노고많으십니다. const uploadNone = multer(); router.post("/write", uploadNone.none(), (req, res, next) => { console.log(req.body); }) multer는 (req, res) 전에 클라이언트 요청을 해석하여 req로 넣어주는 걸로 알고 있습니다. // 컨트롤러 const uploadNone = multer(); exports.noticeWrite = uploadNone.none(), async (req, res, next) => { console.log(req.body); res.end(); }; // 라우터 const { noticeWrite } = require("../controllers/notice"); router.post("/write", isLoggedIn, noticeWrite); 컨트롤러에서 처리하려고 (req, res) 요청 전에 넣어주니 라우터 응답이 안돼서요. 어쩔 수 없이 라우터에서 적어줘야 하는 건지 모르겠습니다. 질문. 컨트롤러에서 multer 사용하는 방법이 궁금합니다!
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
트랜잭션
공식문서를 읽어보면서.. 자동으로 롤백처리되는 transaction을 쓰려고하는데 Cannot read property 'transaction' of undefined 자꾸 이 에러가 뜨는데 찾아봐도 해결이 안되서 질문드립니다.. 몇시간째 찾아봐도 보이지않아요..ㅜㅜ try { const tran = await sequelize.transaction(async (t) => { const {cate1_idx, cate2_idx, cate3_idx, gosu_name, my_place, distance, gender, hp} = req.body; const [results, created] = await Gosu.findOrCreate({ where: {mem_id: req.id}, defaults: {my_place, distance, gender, hp, gosu_name}, } ,{transaction: t}); const result = results && results[0] ? results[0] : created; res.status(200).json(result); }); }catch (err){ console.log(err); next(err); }});
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
안녕하세요
안녕하세요 제로초님 강의듣고 혼자 프로젝트를 해보고있는데, 두 테이블의 연관관계는 1:n인 상황이고 (회원 - 문의) 둘다 paranoid: true로 설정해서 data는남기고 soft delete를 하려하는데 문의 사항을 남긴 회원이 회원탈퇴를 하면 문의도 deleteAt으로 softdelete를 시키고 싶은데,,, 구글링해봐도 훅으로 afterDestroy? 로 하는건가 싶어서 따라했는데 찍히지가 않네요.. associate에 hooks :true, onDelete:'cascade' 설정도 해주었습니다만 .. 이럴땐 어떻게 해야할까요? softdelete와 cascade..
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
강의 질문
안녕하세요. vue X nodebird 수강 전 문의 항목이 없어 여기 질문드립니다. 질문. vue X nodebird 섹션 3. 저의 교과서 강의랑 동일한 거죠?
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
async await에 대해 질문드립니다
강사님 안녕하세요 이 부분을 너무 질문드리는 것 같아서 죄송한 마음에 유튜브 비동기 함수 강의를 앞에서 50분 정도 들었습니다(다른 급한 일들 때문에 한번에 다 못봤지만, 조금씩 꾸준히 다 보겠습니다 ㅠㅠ) 강사님께서 저희를 위해서 주말에 못쉬시고, 강의 올려주셨는데도, 그래도 이해가 어려운 부분이 있어서 하나만 더 봐주시면 감사하겠습니다 ㅠㅠ 아래의 소스코드들은 전부 이미지 파일이 아니라, 복붙 가능하십니다 아래의 1번째 소스코드와 async function a(){ await new Promise((resolve,reject)=>{ resolve(); }) await new Promise((resolve,reject)=>{ resolve(); }) await new Promise((resolve,reject)=>{ resolve(); }) } a(); 아래의 2번째 소스코드가 근본적으로 같은지 실험을 해보고 싶었습니다 async function b(){ await new Promise((resolve,reject)=>{ resolve(); }) } async function a(){ await new Promise((resolve,reject)=>{ resolve(); }) b(); await new Promise((resolve,reject)=>{ resolve(); }) } a(); 확실한 방법은 아래의 async 함수 a( )를 promise. then( ) 구문으로 변환해보면 알 것 같았습니다 async function a(){ await new Promise((resolve,reject)=>{ resolve(); }) await new Promise((resolve,reject)=>{ resolve(); }) await new Promise((resolve,reject)=>{ resolve(); }) } 혹시 위의 async a( ) 함수를 아래처럼 변환하는 게 맞는지 function a(){ return new Promise((resolve,reject)=>{ resolve(); }) .then(()=>{ return new Promise((resolve,reject)=>{ resolve(); }) }) .then(()=>{ return new Promise((resolve,reject)=>{ resolve(); }) }) .then(()=>{ }) } 아니면 아래처럼 변환하는 게 맞는지 질문드리고 싶습니다 function a(){ return new Promise((resolve,reject)=>{ resolve(); }) .then(()=>{ return new Promise((resolve,reject)=>{ resolve(); }) .then(()=>{ return new Promise((resolve,reject)=>{ resolve(); }) .then(()=>{ }) }) }) } 읽어주셔서 감사합니다 ㅠㅠ
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
Promise.resolve( ) 에 대해 질문드리고 싶습니다
안녕하세요 Promise.resolve( )는 비동기 함수인지 질문드리고 싶습니다 스택오버플로우에서는 Promise.resolve( )가 비동기 함수가 아니라는 답변을 봤습니다 결과가 즉시 반환된다고 하더라구요 javascript - Is Promise.resolve a asynchronous function? - Stack Overflow 그런데 아래를 봐주시면 57행의 Promise.resolve( ) 다음에 곧바로 60행의 .then( )으로 넘어가는 게 아니라 58행의 console.log( )가 실행이 되어서혹시, 비동기일 수도 있다는 생각에 질문드리게 되었습니다읽어주셔서 감사합니다
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
node.js에서 전역변수 표시를 하는 방법에 대해 질문드리고 싶습니다
강사님 안녕하세요 아래는 3행에서 a가 전역 스코프 7행의 a변수를 호출하는 것이어서 10이 출력되지만 아래의 소스코드의 경우는 4행의 let이 지역변수 a의 호이스팅을 방지해주기에 3행에서는 지역변수인 a를 출력하지 못한다는 것으로 이해했습니다 그러면 3행에서 console.log(a)를 할 때 이 a가 지역변수 a가 아닌, 전역변수 a 라고 표시를 해주면 출력이 될 것 같았습니다 혹시 그런 표시가 있는지 질문드리고 싶습니다 브라우저가 아닌 node.js에서는 7행의 전역스코프에서 a를 let a로 선언해줘서global.a는 아닌 것 같았습니다 C++ 공부할 때는 전역변수와 지역변수 이름이 같을 때 변수 앞에 ::변수 이렇게 표시하면 전역변수로 구분해준 것으로 기억나는데 자바스크립트에서는 변수 앞에 ::a 이렇게 적어주면 에러가 나서 궁금해서 질문드리고 싶습니다 읽어주셔서 감사합니다
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
카카오를 이용한 로그아웃
카카오로 로그인 후 로그아웃 버튼을 누른 다음 다시 카카오톡으로 로그인 시도시 자동으로 로그인 되는 것 말고 다시 카카오계정과 비번을 치고 로그인 하고 싶은데 어떻게 하면 가능할 까요? 카카오 디벨로퍼 들어가서 계속 로그아웃을 해주어야지만 가능 한걸까요 ?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
jwt 쿠키 발급
안녕하세요. 교과서 446p "JWT 토큰으로 로그인하려면" 부분에서 세션에 데이터를 저장하고 세션 쿠키를 발급하는 대신 토큰을 쿠키로 발급하면 됩니다 부분 보고 만들어보았는데 PEM 키를 사용하려면 passport-jwt 사용 하면 되는 걸까요? auth.js 로그인 라우터 router.post("/login", async (req, res, next) => { const user = await User.findOne({ where: { name: req.body.name }}); const compare = await bcrypt.compare(req.body.password, user.password); if (!compare) { console.log("비밀번호 불일치"); return res.redirect("/"); } const token = jwt.sign({ name: user.name, }, process.env.COOKIE_SECRET, { expiresIn: "1m", issuer: "test", }); res.cookie("user", token).redirect("/test"); }); router.get("/test", verifyToken, async (req, res, next) => { console.log(req.decoded); res.end(); }); verifyToken 미들웨어 const jwt = require("jsonwebtoken"); exports.verifyToken = (req, res, next) => { try { req.decoded = jwt.verify(req.cookies.user, process.env.COOKIE_SECRET); return next(); } catch (err) { console.error(err); } };
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
http 서버 성능
노드로 http 서버를 만들어서 돌리면 아파치 서버나 Nginx 만큼의 성능을 발휘할수가 있나요? 전문 웹서버는 세부 셋팅이나 튜닝같은것도 필요하고 ssl 셋팅도 필요한데 노드로 HTTP서버를 돌릴때 얼마만큼의 성능을 기대할수 있을까요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
혹시 ppt자료는 어디에 있나요..?
혹시 ppt자료는 어디에 있나요..?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
try로 감싸는 범위가 궁금합니다.
try로 res.writeHead 부분은 안 감싸도 상관 없나요? 감싸는 기준이 await이면 await 한 줄만 감싸도 상관이 없는 건가요?
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
operation not permitted, rename 에러에 대해 질문드리고 싶습니다
강사님 안녕하세요 비동기 함수와 await을 조합해서 아래의 소스코드를 실험해봤는데, 이해가 어려운 부분이 있어서 질문드리고 싶습니다 const fs = require('fs'); const path = require('path'); function func(){ fs.open(`.\\b.txt`, 'w', (err, fd)=>{ if(err) { //실패한 경우 throw err; }//성공한 경우 }); fs.rename(`.\\b.txt`, `.\\c.txt`,(err,data)=>{ if(err) { throw err; } }); fs.writeFile(`.\\c.txt`, `Hello `, (err)=>{ if(err) { console.log(err); } }); } func(); 터미널에서 실행시켰습니다 이렇게 c.txt가 잘 만들어졌습니다 이번엔 18행부터 24행의 주석을 풀었습니다 그러자, 이번에는 같은 소스코드인데도 실행결과가 성공이 나오기도 하고, 실패하기도 했습니다 실행 성공 했을 때는 c.txt 에도 Hello 가 잘 적혔습니다 주석을 해제한 소스코드를 디버깅 모드에서 한줄씩 실행할 때는 무조건 성공이었는데 터미널 또는 vscode에서 한번에 실행시키면 이렇게 실행결과가 복불복이 나와서 혹시 그 이유가 궁금해서 질문드리고 싶습니다읽어주셔서 감사합니다
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
var와 global에 대해 질문드리고 싶습니다
강사님 안녕하세요 https://inf.run/iURH지난번 질문도 다시 확인해봤는데, 이해가 어려워서 가르쳐주시면 감사하겠습니다아래의 소스코드의 1행에서 var를 붙였을 때와 안붙였을 때, 출력결과가 달라져서 질문드리고 싶습니다소스코드는 맨 아래에 첨부했습니다1번째 질문부터 3번째 질문까지 1행의 name1 변수 앞에 var 붙이고 안붙이고 let 붙이고 차이입니다 1번째로 드리고 싶은 질문은,아래의 이미지처럼 1행의 name1 앞에 var를 붙였을 때 this.name1이 undefined로 나타나는 이유를 질문드리고 싶습니다. this가 global 이므로, 1행의 name1이 출력될 줄 알았는데 아니어서 질문드리고 싶습니다. 2번째로 드리고 싶은 질문입니다. 이번에는 1행에서 var를 지웠습니다 this는 global 이어서 this.name1의 출력결과가 name1으로 나올 것 같았습니다그런데 왜 이번에는 this.name1의 출력결과가 name1이 아닌 aaa로 나오는지 질문드리고 싶습니다 3번째로 드리고 싶은 질문입니다 이번에는 1행에 let을 붙였습니다 여기서 global.name1 이 왜 undefined 로 나오는지 이해가 어려워서 질문드리고 싶습니다 4번째로 드리고 싶은 질문은 global과 module.exports 중 어느 것이 더 상위 객체인지 질문드리고 싶습니다 너무 긴 질문을 읽어주셔서 감사합니다 아래는 소스코드입니다 let name1 = 'name1'; const objectA = { name1: 'objectA.name1', getname: function(){ name1 = "aaa"; const name2 = 'name2'; console.log(`this.name1: ${this.name1}`); function fullname() { // this: global console.log(`>> name1:${name1}, name2:${name2}, this.name1:${this.name1}, this.name2:${this.name2}, this${this}`); return `>>>> objectA.name1 + name2: ${objectA.name1} ${name2}`; }; return fullname(); }, } console.log(objectA.getname());
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
await Promise.All([...])시 예외 처리 질문
강의 수강중 공부 목적으로 로그인을 포함한 웹소캣 채팅 앱을 만들고 있습니다. 회원가입을 구현하던 중 질문이 고민이 생겨 질문드립니다. email, nickname, password를 받아서 길이, 형식 체크를 한 뒤 email과 nickname은 DB에서 중복 체크를 하고 문제가 없으면 DB에 insert하는 방식입니다. email과 nickname을 DB에서 중복확인 하는 함수 checkEmailExists과 checkNicknameExists은 서로 독립적이어서 promise를 먼저 받고 await Promise.All로 결과를 받아 하나라도 실패하면 try-catch에서 에러처리 하도록 했습니다. 질문1 Promise.All을 쓰는것이 적절한가요? 하나라도 실패하면 안되기에 AllSattled 대신 All을 사용했고 서로 독립적이어서 둘대 백그라운드로 먼저 넘긴 뒤 한번에 All로 받았습니다. 질문2 위와같이 작성하면 데이터베이스 오류와 서버에러에 구분이 안됩니다. 그래서 생각한 방법이 두가지가 있는데 하나는 db요청을 보내는 함수에서 try-catch로 db에러를 걸러내는 것이고 다른 하나는 서버에러를 잡는 위 코드의 try-catch문 안에 db요청에 또 try-catch로 감싸 이중 try-catch를 하는 방법입니다. db요청 함수 안에서 try-catch를 하면 catch 부분에서 res.json을 하기 위해 res를 넘겨주거나 혹은 catch부분에서 db error 메세지를 리턴해서 위 signUp 함수에서 db error 메세지를 받았을 때 과정을 따로 처리해야 할것같습니다. 이 방법은 db요청을 하나만 처리할 때는 쉽게 할 수 있을 것 같은데 await Promise.All을 쓰니 어떻게 해야할지 감이 안잡힙니다. 이렇게 await Promise.All의 에러를 .catch로 잡을 수도 있나요? 위가 가능하다면 signUp함수에 return을 안해서 뒤 과정이 실행될것 같은데 catch안에서 return res.json(...)을 해도 return은 catch의 콜백함수에 대한 return아닌가요? 위처럼 await promise.catch()가 가능하다면 catch가 실행 되었을 때 signUp 함수는 어떻게 종료 시킬 수 있나요? 이중 try-catch의 경우 일단 생긴것부터 이건 좀 아닌것같고 무엇보다 const가 블록레벨 스코프라 콜백 지옥마냥 그 db요청 결과에 관련된 모든 것을 try-catch안에 넣어야해서 포기했습니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
DB 관련 질문
안녕하세요 강사님 ! node js 교과서 수강생입니다. 다름이 아니라 최근에 공부겸해서 node-json-db로 CRUD를 연습하고 있는데 . 수업에 직접적인 관련이 있는 부분은 아니여서 이런것도 질문을 드려도 될지 모르겠네요 ㅜㅜ 위 사진에서 보시다시피 테이블당 class를 생성해서 CRUD하는 Method를 각각 생성해주고 router에서 require하는 부분에 const user = new User(); 를 해주고 url routing 해주는 부분에서는 user.select(phoneNum); 이런식으로 사용하고 있는데 배웠던 내용이랑 자바에서 쓰던 습관이 짬뽕되서 사용하고 있는 느낌이라 약간 불안하네요... 프로그래밍에 답은 없다지만 이게 오답이거나 문제가 생길 수 있는 요인들이 있을까요?
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
진도 질문
안녕하세요. 현재 진도는 9강까지 복습하고 스스로 해보기도 완료하였습니다. 프론트는 실무에서 리뷰앵이라고 말씀하셨는데 어차피 나중에는 다 할 줄 알아야 한다고 하지만 현재 시점에서 뷰 공부(vue 무료 강좌 ㅡ> vue NodeBird)부터하고 10강 진도를 나갈지 고민입니다. 목표는 서버 개발자입니다. 감사합니다. 추신 인간 js 엔진 강의 잘 보고 있습니다.
- 미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
REST API와 /users 요청 시 Header 관련 질문입니다!
제가 이해하는 부분이 맞는지 두 가지만 질문드려요ㅠㅠ edit.addEventListener('click', async () => { // 수정 버튼 클릭 const name = prompt('바꿀 이름을 입력하세요'); if (!name) { return alert('이름을 반드시 입력하셔야 합니다'); } try { await axios.put('/user/' + key, { name }); getUser(); } catch (err) { console.error(err); } }); 1. 위 코드처럼 PUT 메소드 요청 시 /user/을 하는 이유가 REST API를 따른사용자 중 Id가 key값인 사용자에 대해 정보 수정을 요청는 의미로 /user/를 작성했다고 이해하면 될까요? else if (req.url === '/users') { res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' }); return res.end(JSON.stringify(users)); } 2. 위 코드에서 res.writeHead() 부분이 restFront.js 파일에서 getUser() 함수 내 const res = await axios.get('/users'); const users = res.data; res에 할당돼서 Header에 대한 정보 중 data의 값을 뽑아오고 res.end() 부분은 Response 탭에 응답된다고 보는 것이 맞을까요?console.log(res); 할 때 아래처럼 값이 출력되네요!
- 해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
resolve( ) 에 대해 질문드립니다
강사님 안녕하세요 resolve( )에 대해 질문드리고 싶습니다 아래의 소스코드를 봐주시면 setInterval( )이 1초마다 resolve(message)를 실행해줍니다. .then((message)=>{ return new Promise((resolve, reject)=> { setInterval(()=>{ console.log('1초마다 실행'); resolve(message);},1000); }); }) .then((message2)=>{ return new Promise((resolve, reject)=> { setTimeout(()=>{ console.log('0.5초 후 실행'); resolve(message2);},500); }); }) 그런데, 다음 .then( )으로 간 경우는첫 번째 resolve(message) 일 때 뿐이었고 setInterval( ) 으로 1초마다 반복해서 resolve(message) 를 호출해도 resolve(message)를 2번째 호출할 때부터는 다음 .then( ) 구문으로 가지 않았습니다. 그래서 원인을 생각해봤는데, resolve( )만 리턴해서 그런 게 아닐까 라는 생각이 들었습니다 setInterval( ) 이 resolve( ) 뿐만 아니라, promise( resolve( ) )를 반복하게 해봤습니다 .then((message)=>{ return setInterval(()=>{ new Promise((resolve, reject)=> { console.log('1초마다 실행'); resolve(message); }); } ,1000); }) 그러나 이번에도 2번째 호출부터는 다음 .then 으로 넘어가지 않았습니다 이번에는 then의 콜백 자체를 감싸봤습니다 .then(setInterval((message)=>{ return new Promise((resolve, reject)=> { console.log('1초 후 실행'); resolve(message); }); },1000)) 그래도 결과는 마찬가지였습니다그래서 혹시 그 이유가 궁금해서 setInterval( ) 로 resolve( message ) 또는 new promise( resolve( message ) ) 또는 then의 콜백함수까지 반복 호출해도 2번째 호출 부터는 다음 .then 으로 넘어가지 않는 이유에 대해 질문드리고 싶습니다