인프런 업데이트 소식 🔨👷🏼‍♂️
Node.js 교과서 - 기본부터 프로젝트 실습까지

Node.js 교과서 - 기본부터 프로젝트 실습까지

(26개의 수강평)

579명의 수강생

55,000원

평생
초급
수료증
145회 수업, 총 23시간 14분
위시리스트 추가
김규민 프로필

오류가 납니다.ㅜㅜ 김규민 3일 전

TypeError: C:\Program Files\pjt\visualcode_workspace\nodebird\views\main.pug:23
   21|       for twit in twits
   22|         .twit
 > 23|           input.twit-user-id(type='hidden' value=twit.user.id)
   24|           input.twit-id(type='hidden' value=twit.id)
   25|           .twit-author= twit.user.nick
   26|           -const follow = user && user.Followings.map(f => f.id).includes(twit.user.id);

Cannot read property 'id' of undefined
   at eval (eval at wrap (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\pug-runtime\wrap.js:6:10), <anonymous>:166:113)
   at eval (eval at wrap (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\pug-runtime\wrap.js:6:10), <anonymous>:293:4)
   at template (eval at wrap (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\pug-runtime\wrap.js:6:10), <anonymous>:799:121)
   at Object.exports.renderFile (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\pug\lib\index.js:427:38)
   at Object.exports.renderFile (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\pug\lib\index.js:417:21)
   at View.exports.__express [as engine] (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\pug\lib\index.js:464:11)
   at View.render (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\express\lib\view.js:135:8)
   at tryRender (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\express\lib\application.js:640:10)
   at Function.render (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\express\lib\application.js:592:3)
   at ServerResponse.render (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\express\lib\response.js:1012:7)
   at Post.findAll.then (C:\Program Files\pjt\visualcode_workspace\nodebird\routes\page.js:33:13)
   at tryCatcher (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\bluebird\js\release\util.js:16:23)
   at Promise._settlePromiseFromHandler (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\bluebird\js\release\promise.js:517:31)
   at Promise._settlePromise (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\bluebird\js\release\promise.js:574:18)
   at Promise._settlePromise0 (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\bluebird\js\release\promise.js:619:10)
   at Promise._settlePromises (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\bluebird\js\release\promise.js:699:18)
   at _drainQueueStep (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\bluebird\js\release\async.js:138:12)
   at _drainQueue (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\bluebird\js\release\async.js:131:9)
   at Async._drainQueues (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\bluebird\js\release\async.js:147:5)
   at Immediate.Async.drainQueues (C:\Program Files\pjt\visualcode_workspace\nodebird\node_modules\bluebird\js\release\async.js:17:14)
   at runCallback (timers.js:705:18)
   at tryOnImmediate (timers.js:676:5)


왜 이런 오류가 나오는지 잘 모르겠습니다.

어떻게 수정하고 대체 뭘 잘못한거죠 ㅠ

1
문장훈 프로필

rooms[req.params.id].length 질문드립니다! 문장훈 6일 전

index.js에있는 /room/:id 라우터에서요! adapter가 궁금해서 console.log로 출력 해보았는데. 웹브라우저 4개가 동시에 방에 접속해 있을때 rooms[req.params.id].length 길이가 3이 나오더라구요. 왜 1이 줄어드는 건가요?

1
김성근 프로필

PUT, DELETE 같은 경우 URL에 ID 값 처리 김성근 6일 전

PUT, DELETE 같은 경우에는 /user/{id}로 들어가서 실행이 안되는데 어떻게 분기를 해야하는게 맞을까요?

인강과 동일하게 따라했는데 GET, POST는 잘되나 PUT, DELETE는 안되네요.

1
한예성 프로필

[window os] cli 명령어를 못찾습니다.... 한예성 8일 전

```

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에 대한 경로가 제대로 설정되지 않아서 일수 있다는데 

-> 이부분은 모르겠습니다.

어떤 부분에서 문제가 있는걸까요?

1
한예성 프로필

+new Date()에서 new앞에 + 는 먼가요? 한예성 17일 전

+new Date()에서 new앞에 + 는 먼가요?

1
yjkwon9073 프로필

카카오 로그인 yjkwon9073 18일 전

카카오 전략 부분에서 언제 

passport.serializeUser()가 호출 되나요? 

 

1
yjkwon9073 프로필

foreignKey 이해 yjkwon9073 18일 전

다대다의 관계에서  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설정 시 어떤 기준으로 정하는건지 잘 모르겠습니다.

1
hsjo12 프로필

질문이요 hsjo12 18일 전

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

.

.

.

 

2
hsjo12 프로필

질문이요 hsjo12 19일 전

redis 쓰면, 이런 에러가 납니다 

 

Error: A client must be directly provided to the RedisStore

코드를 똑같이 복사해도 같은 에러가 뜨네요... 

 

2
hsjo12 프로필

질문이요. hsjo12 21일 전

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 로 바로 가는거 맞죠?????

1
hsjo12 프로필

질문이여 hsjo12 22일 전

예를들어서 

12시에 샹품을 등록을 하면 , 종료시간이 24시간 입니다. 

 

그러고, 서버를 한 한시간정도 껏다가 다시키니까, 

종료시간이 23시간으로 바뀌어 있더라구요

 

npm start로 서버를 돌리는 상태가 아닌데도 어떻게 시간이 저장되어있어서 지난 시간에 맞게 종료시간이 줄어드는지 궁금하네요

2
hsjo12 프로필

질문이요 hsjo12 24일 전

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개의 선택지 밖에 없는 부분인가요 ?? ?

1
문장훈 프로필

session과 jwt의 명확한 차이가 무엇인가요? 문장훈 26일 전

passport모듈을 보면 session으로 되어있는것(nodebird에서 사용) 도있고 jwt로 되어있는 것도 있더라구요. 그런데 session으로 하는것과 jwt로 하는것의 명확한 차이를 잘 모르겠어요. 각각 사용되어지는 상황이 다른건가요?  그리고 jwt토큰은 변조는 불가능 하지만 내용이 다 보이는데 로그인 할때 jwt를 사용에도 보안적으로 문제가 없는건가요?

1
yjkwon9073 프로필

Post, User JOIN yjkwon9073 26일 전

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이 안찍혀 있어서 제가 잘 못 이해한건지 궁금합니다.

2
hsjo12 프로필

질문이요 hsjo12 27일 전

방에들어가는 라우터에서요, 

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;

이게 어떤식으로 정보를 저장하는지 몰라서 그러는거같은데

설명좀 부탁드려요 . 

 

 

3