수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
PUT, DELETE 같은 경우 URL에 ID 값 처리
PUT, DELETE 같은 경우에는 /user/{id}로 들어가서 실행이 안되는데 어떻게 분기를 해야하는게 맞을까요? 인강과 동일하게 따라했는데 GET, POST는 잘되나 PUT, DELETE는 안되네요.
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
[window os] cli 명령어를 못찾습니다....
``` C:\Users\Han\Desktop\node_study\node-cli>npm i -g C:\Users\Han\AppData\Roaming\npm\cli -> C:\Users\Han\AppData\Roaming\npm\node_modules\node-cli\index.js + node-cli@0.0.1 updated 1 package in 0.153s C:\Users\Han\Desktop\node_study\node-cli>cli ``` 'cli'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 현재 패키지는 제대로 설치 되는것 같은데 설치후 cli명령을 쳐도 인식을 못합니다. 제가 조사해 본 부분은 1. package.json을 제대로 작성했나? -> 동영상에 나온 코드와 같습니다.... 2. 이것저것 찾아본 결과 환경번수에 Path에 대한 경로가 제대로 설정되지 않아서 일수 있다는데 -> 이부분은 모르겠습니다. 어떤 부분에서 문제가 있는걸까요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
+new Date()에서 new앞에 + 는 먼가요?
+new Date()에서 new앞에 + 는 먼가요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
카카오 로그인
카카오 전략 부분에서 언제 passport.serializeUser()가 호출 되나요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
foreignKey 이해
다대다의 관계에서 foreignKey는 상대 테이블 아이디를 사용하는거라면 db.User.belongsToMany(db.User, {through: 'Follow', as : 'Followers', foreignKey: 'followingId'}); db.User.belongsToMany(db.User, {through: 'Follow', as : 'Followings', foreignKey: 'followerId'}); 1대다의 관계에서 user와 post 관계에서 Post설정시 foreignKey는 userId를 가리키는거 아닌가요? 가리키는게 맞다면 Post의 상대 테이블 아이디가 userId라서 설정 된건가요? db.User.hasMany(db.Post); db.Post.belongsTo(db.User, {as: "User", foreignKey: "userId"}); foreignKey설정 시 어떤 기준으로 정하는건지 잘 모르겠습니다.
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요
npm i 로 필요한 부분들 다 깔고, sudo npm start 하고 나서 npm monit 하니까 , bcrypt 모듀을 찾을 수 없다고 에러가 나더라구요. 그래서 npm i bcrypt 으로 다운을 받으려고 시도 하니까, node-pre-gyp WARN Using needle for node-pre-gyp https download node-pre-gyp WARN Tried to download(404): https://github.com/kelektiv/node.bcrypt.js/releases/download/v3.0.6/bcrypt_lib-v3.0.6-node-v72-linux-x64-glibc.tar.gz node-pre-gyp WARN Pre-built binaries not found for bcrypt@3.0.6 and node@12.9.1 (node-v72 ABI, glibc) (falling back to source compile with node-gyp) make: Entering directory '/home/hsjo920914/nodebird/node_modules/bcrypt/build' CXX(target) Release/obj.target/bcrypt_lib/src/blowfish.o CXX(target) Release/obj.target/bcrypt_lib/src/bcrypt.o CXX(target) Release/obj.target/bcrypt_lib/src/bcrypt_node.o 이 상태에서 진행이 되는건지도 모를 정도로 멈쳐버리네요.. 지금 한 20분이상 기다리는데 진정이 없는데, 이럴때는 어떻게 해결 해야 할까요... g++: internal compiler error: Killed (program cc1plus) Please submit a full bug report, with preprocessed source if appropriate. See <file:///usr/share/doc/gcc-5/README.Bugs> for instructions. bcrypt_lib.target.mk:111: recipe for target 'Release/obj.target/bcrypt_lib/src/bcrypt_node.o' failed make: *** [Release/obj.target/bcrypt_lib/src/bcrypt_node.o] Error 4 make: Leaving directory '/home/hsjo920914/nodebird/node_modules/bcrypt/build' gyp ERR! build error gyp ERR! stack Error: `make` failed with exit code: 2 . . .
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요
redis 쓰면, 이런 에러가 납니다 Error: A client must be directly provided to the RedisStore 코드를 똑같이 복사해도 같은 에러가 뜨네요...
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요.
router.js 에서요 경매 입찰 라우터에서요, router.post('/good/:id/bid', isLoggedIn, async (req, res, next) => { ..... ..... req.app.get('io').to(req.params.id).emit('bid', { bid: result.bid, msg: result.msg, nick: req.user.nick, }); .... .... }} 이 소켓은, auction.pug 에있는, socket.on('bid', function (data) { var div = document.createElement('div'); var span = document.createElement('span'); span.textContent = data.nick + '님: '; var strong = document.createElement('strong'); strong.textContent = data.bid + '원에 입찰하셨습니다.'; div.appendChild(span); div.appendChild(strong); if (data.msg) { span = document.createElement('span'); span.textContent = '(' + data.msg + ')'; div.appendChild(span); } document.querySelector('#bid').appendChild(div); }); 이 이벤트를 발생시키잖아요. 1. req.app.get('io').to(req.params.id).emit('bid' 이 부분에서, to 특정한 것에 보내는것인데, .to(req.params.id) 가 어떤식으로 인식을해서 보내지는지 이해가 안가네요 정작 acution.pug 에서는 socket.on('bid', function (data) { 는 id 가 몇인지 구분하는게 없는거 같은데 말이죠??... 2. 라우터 -> socket.js -> auction .pug 로 바로 가는거 맞죠?????
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이여
예를들어서 12시에 샹품을 등록을 하면 , 종료시간이 24시간 입니다. 그러고, 서버를 한 한시간정도 껏다가 다시키니까, 종료시간이 23시간으로 바뀌어 있더라구요 npm start로 서버를 돌리는 상태가 아닌데도 어떻게 시간이 저장되어있어서 지난 시간에 맞게 종료시간이 줄어드는지 궁금하네요
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요
axios.post(`http://localhost:8005/room/${roomId}/sys`,{ type: 'join', },{ headers:{ Cookie: `connect.sid=${'s%3A'+cookie.sign(req.signedCookies['connect.sid'], process.env.COOKIE_SECRET)}` }, 헤더에 쿠키를 보내주는 부분이요, 익스프레스 서버에서 1. 기존의 쿠키와, 지금 요청간 쿠키를 알아서 비교를 해주는 부분인가요? 이 쿠키 또는 세션은 얼마나 유지되나요 ? ___________________________________________ const chat = req.body.type === 'join' // socket.js axios 에서 type (요청의 본문의 타입 그래서 req.body.type) ? `${req.session.color}님이 입장하셨습니다` // type이 join이면 : `${req.session.color}님이 퇴장하셨습니다`; 그리고 이 문법이요 2. if 같다고 생각하면 되는건가요 ? ? 조건에 맞을때이고 : 조건에 부합하지 않을때라고 생각하면 되나요? 그러면 이거는 false 일때 어떤 결괏값 그리고 true 일때 어떤 결괏값 이런식으로 2개의 선택지 밖에 없는 부분인가요 ?? ?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
session과 jwt의 명확한 차이가 무엇인가요?
passport모듈을 보면 session으로 되어있는것(nodebird에서 사용) 도있고 jwt로 되어있는 것도 있더라구요. 그런데 session으로 하는것과 jwt로 하는것의 명확한 차이를 잘 모르겠어요. 각각 사용되어지는 상황이 다른건가요? 그리고 jwt토큰은 변조는 불가능 하지만 내용이 다 보이는데 로그인 할때 jwt를 사용에도 보안적으로 문제가 없는건가요?
- 해결됨Node.js 교과서 - 기본부터 프로젝트 실습까지
Post, User JOIN
join하는 과정에서 attributes:['id', 'nick']을 하게된다면 router.get('/', (req, res, next) => { Post.findAll({ include: { model: User, attributes: ['id', 'nick'], }, order: [['createdAt', 'DESC']], }) Post의 컬럼과 User의 id와 nick컬럼을 join해서 가져오는거 아닌가요? 그런데 로그를 찍어 본 결과 ``` dataValues: { id: 1, content: '안녕하세요 #노드 #아리송', img: '', createdAt: 2019-08-27T03:47:19.000Z, updatedAt: 2019-08-27T03:47:19.000Z, deletedAt: null, userId: null, user: null }, ``` nick이 안찍혀 있어서 제가 잘 못 이해한건지 궁금합니다.
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요
방에들어가는 라우터에서요, const { rooms } = io.of('/chat').adapter; 이것을 통해서, 인원수를 구하잖아요. 정확히 adpater 가 무엇이고 어떻게 동작하는지 모르겠어요 설명 좀 부탁드려요. 그리고, 제가 다른 종류 브라우저 말고도, 그냥 크롬창 여러개 띄어도 인원수가 오르더라구요. 그래서, const { rooms } = io.of('/chat').adapter; console.log(rooms) console.log(rooms[req.params.id]) 이런식으로 콘솔을 찍어 보았어요. 실험 1. 방을 한개 만들고, 새창 여러개로 같은 방 한개 들어가기 console.log(rooms) 결과값 : { '/chat#rC63n8xyVth_znN0AAAA': Room { sockets: { '/chat#rC63n8xyVth_znN0AAAA': true }, length: 1 }, '5d64e09b9b873811fc6be793': Room { sockets: { '/chat#rC63n8xyVth_znN0AAAA': true, '/chat#Ion8Gy0D2IPHw2asAAAC': true, '/chat#dW1lh61HDNDZgtUoAAAE': true, '/chat#zyZAZfj99vt4o_qmAAAD': true, '/chat#_zy1s7cDk6VzPKPwAAAF': true }, length: 5 }, '/chat#h9tN1OVDzUCgOUVvAAAB': Room { sockets: { '/chat#h9tN1OVDzUCgOUVvAAAB': true }, length: 1 }, '5d64dd1a8d9e4c0d0fa953e7': Room { sockets: { '/chat#h9tN1OVDzUCgOUVvAAAB': true }, length: 1 }, '/chat#Ion8Gy0D2IPHw2asAAAC': Room { sockets: { '/chat#Ion8Gy0D2IPHw2asAAAC': true }, length: 1 }, '/chat#dW1lh61HDNDZgtUoAAAE': Room { sockets: { '/chat#dW1lh61HDNDZgtUoAAAE': true }, length: 1 }, '/chat#zyZAZfj99vt4o_qmAAAD': Room { sockets: { '/chat#zyZAZfj99vt4o_qmAAAD': true }, length: 1 }, '/chat#_zy1s7cDk6VzPKPwAAAF': Room { sockets: { '/chat#_zy1s7cDk6VzPKPwAAAF': true }, length: 1 } } console.log(rooms[req.params.id]) 결과값: Room { sockets: { '/chat#rC63n8xyVth_znN0AAAA': true, '/chat#Ion8Gy0D2IPHw2asAAAC': true, '/chat#dW1lh61HDNDZgtUoAAAE': true, '/chat#zyZAZfj99vt4o_qmAAAD': true, '/chat#_zy1s7cDk6VzPKPwAAAF': true }, length: 5 } 이렇게 나오면, 소켓 5 개가 사용됬다는걸 알 수 있던데요. 실험 2 방 A 를 만든다( 만들면 자동으로 들어가짐) A 의 req.params.id 는 '5d64f4aab36b762d2becb422' console.log(rooms) 결과값 : {} console.log(rooms[req.params.id]) 결과값: undefined 새창을 하나 열어서, 방 A 로 들어간다. console.log(rooms) 결과값 : { '/chat#Dqd1TiXLKQZHEsjKAAAC': Room { sockets: { '/chat#Dqd1TiXLKQZHEsjKAAAC': true }, length: 1 }, '5d64f4aab36b762d2becb422': Room { sockets: { '/chat#Dqd1TiXLKQZHEsjKAAAC': true }, length: 1 } } console.log(rooms[req.params.id]) 결과값: Room { sockets: { '/chat#Dqd1TiXLKQZHEsjKAAAC': true }, length: 1 }이 나옵니다. 새창을 또 하나 열어서, 방 A 로 들어간다. console.log(rooms) 결과값 : { '/chat#B7ZV-1fDOnIVJzCzAAAA': Room { sockets: { '/chat#B7ZV-1fDOnIVJzCzAAAA': true }, length: 1 }, '5d64f4aab36b762d2becb422': Room { sockets: { '/chat#B7ZV-1fDOnIVJzCzAAAA': true, '/chat#bQybDCrRdzFs_AnsAAAB': true }, length: 2 }, '/chat#bQybDCrRdzFs_AnsAAAB': Room { sockets: { '/chat#bQybDCrRdzFs_AnsAAAB': true }, length: 1 } } console.log(rooms[req.params.id]) 결과값: Room { sockets: { '/chat#B7ZV-1fDOnIVJzCzAAAA': true, '/chat#bQybDCrRdzFs_AnsAAAB': true }, length: 2 } 지금 여기서 보면, 실질적으로 방 A에는 3 명의 인원이 들어가있는데 lenght 는 2로 나옵니다. 그런데 특이하게 방 B를 만들면, 방 A에 3 명이(옳은 인원수) 들어가 있다고 업데이트가 됩니다. B 의 req.params.id 는 '5d64ecdedcd19c1e1979ad8b' console.log(rooms) 결과값 : { '/chat#B7ZV-1fDOnIVJzCzAAAA': Room { sockets: { '/chat#B7ZV-1fDOnIVJzCzAAAA': true }, length: 1 }, '5d64f4aab36b762d2becb422': Room { sockets: { '/chat#B7ZV-1fDOnIVJzCzAAAA': true, '/chat#bQybDCrRdzFs_AnsAAAB': true, '/chat#P4zrqxRE0Sv_sJySAAAD': true }, length: 3 }, '/chat#bQybDCrRdzFs_AnsAAAB': Room { sockets: { '/chat#bQybDCrRdzFs_AnsAAAB': true }, length: 1 }, '/chat#P4zrqxRE0Sv_sJySAAAD': Room { sockets: { '/chat#P4zrqxRE0Sv_sJySAAAD': true }, length: 1 } } console.log(rooms[req.params.id]) 결과값: undefined 하지만, 방 B에는 인원이 1 명이 들어 있음에도 불가하고 , 방 B의 정보는 찍히지가 않습니다. 그리고 방 B에 새창으로 들어가면, 방 B에 1 이 뜹니다. 마찬가지로, 방 A 새창으로 들어가면, 방 B에는 2명이라고 뜨고, 방 A에는 4명이 떠야하는데 3명이라 뜹니다. 이와 같이, 방에들어가면 바로 업뎃이 안되는데 이유좀 알 수있을까요??? 이유 인즉슨, 5d64ecdedcd19c1e1979ad8b B의 req.params.id 값이 없고, A의 값에 소켓들이 추가 되더라구요 length 1에서 2 를 보실수 있듯이요. 제가 정확히 const { rooms } = io.of('/chat').adapter; 이게 어떤식으로 정보를 저장하는지 몰라서 그러는거같은데 설명좀 부탁드려요 .
- Node.js 교과서 - 기본부터 프로젝트 실습까지
제로초님
삭제된 글입니다
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
require('passport') 질문입니다.
auth.js 에서 const express = require('express'); const bcyrpt = require('bcrypt'); const passport = require('passport'); passport모듈을 불러와서 router.post('/login', isNotLoggedIn, (req, res, next) => { passport.authenticate('local', (authError, user, info) => { if (authError) { console.error(authError); return next(authError); } passport.authenticate('local', ...)을 사용하셨는데 passport모듈을 불러와서 사용했기 때문에 여기서 passport는 localsSrategy를 모르지 않나요?
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요
script(src='/socket.io/socket.io.js') script. var socket = io.connect('http://localhost:8005/room', { path: '/socket.io' }); main.pug 에서 이거 용도좀 알려주실수있나요? 대충 socket.io를 커넥할때쓰는거 같은데, 1. 지금이게 발생하면, socket.js 에서 무슨일이 벌어지는지 좀 자세히 알려주실수 있나요?? 2. 방생성 라우터에서 const io = req.app.get('io'); 이 부분 정확히 이해가 안가네요? req는 room.pug에서 submit되는 순간, 이 라우터에 걸리는거로 아는데, req. 즉 room.pug가 어떻게 app.get('io')로 요구할 수 있는지 궁금하네요? 그리고 왜 필요한지도 궁금하네요? 3. const io = req.app.get('io'); io.of('/room').emit('newRoom', newRoom); // newRoom 이벤트 발생 이거요, io.of('/room') 이 네임스페이스를 뜻하는거 잖아요. 그러고, emit을 통해서, 'newRoom'이라는 이름의 이벤트를 발생시키고, newRoom 이라는 데이터값을 주는걸로 알고 있는데요. 저는 newRoom 이벤트가, soket.js 에서만, 존재하는줄 알았어요, 왜냐면 네임스페이스로 쓰였기 때문예요. 근데 실상은, main.pug 에서 이벤트 대기했다가 발생하게 되있더라구요 여기서 질문이요, 그러면, 아무 pug에서 newRoom 이라는 이벤트가 3 개 정도 동시에 쓰여있다고하면은, 이 3개의 이벤트가 동시에 일어나나요? 4. router.post('/room', async (req, res, next) => { try { const room = new Room({ title: req.body.title, max: req.body.max, owner: req.session.color, password: req.body.password, }); const newRoom = await room.save(); const io = req.app.get('io'); io.of('/room').emit('newRoom', newRoom); res.redirect(`/room/${newRoom._id}?password=${req.body.password}`); // 방에 접속하는 라우터 } catch (error) { console.error(error); next(error); } }); 여기서 질문이 있는데요 console.log(newRoom._password) // undefine console.log(newRoom.password) // 값나옴 console.log(newRoom._id) // 값나옴 console.log(newRoom.id) // 값나옴 제가 기억하기로, 몽고디비에서, 값을 부르려면 ._ 이거는 해야한다고 들었는데요. 여기서, newRoom._password 하면 undefine 나오네요... console.log(newRoom) 을 찍어보면, { max: 10, _id: 5d649d93a0c2c01ace5ab98e, title: 'aaaa', owner: '#c5879a', password: '123', createAt: 2019-08-27T03:03:47.611Z, __v: 0 } 이런식으로 DB가 저장되 있는걸 확인할수 있는데요 자동 생성이 되면 _ 이게 붙는 건가요?? 즉 자동생성된거만 ._ 이런식으로 접근하는건가요??
- 해결됨Node.js 교과서 - 기본부터 프로젝트 실습까지
버전
MongoDB설치시 버전은 책과 동일한 버전으로 설치해야할까요? 아니면, 최신 버전으로 설치해도 괜찮을까요
- 해결됨Node.js 교과서 - 기본부터 프로젝트 실습까지
matchedUrl 이 ReferenceError가 나면서 종료될 때
강의 잘 듣고 있습니다. 강의대로 라우팅하고 실행해보고 싶어, 서버를 동작시켰는데 matchedUrl 이 ReferenceError 가 나면서 서버가 종료됩니다. 강의대로라면 기본값 연산자로 인해 로직이router[req.method.toLowercase()]['*'] 로 넘어가야 할 것 같은데, 넘어가지 않고 종료됩니다 ㅠㅠ 아래와 같은 에러가 나옵니다 : (matchedUrl || router[req.method.toLowerCase()]['*'])(req, res); ^ ReferenceError: matchedUrl is not defined
- 해결됨Node.js 교과서 - 기본부터 프로젝트 실습까지
프론트쪽 공부 질문이요
프론트쪽 공부도 해야 할 거같아서요. 혹시 프론트쪽만 따로 가르치시는 강의는 없으신가요?? 유튜브에서 보니까, 리엑트도 강의 하시던데요. 리엑트를 프론트로 쓰면, 지금 현재쓰고 있는 퍼그는 안쓰는건가요?? 그냥 리액트(프론트)+노드JS(백엔드) 이런식으로 되는 건가요 ?? 아니면, 인프런 강의중에 혹시 따로 프론트 쪽 가르치시는거 있으면, 추천좀 해주세요 가이드 좀 부탁드려요
- 미해결Node.js 교과서 - 기본부터 프로젝트 실습까지
질문이요
socekt.join 하고 .leave 내장 함수 잖아요. 그러면, socket IO 자체가 주 목적이 채팅을 위해서 만들어 진건가요??