inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

캐싱 간단한 질문입니다

234

wdhgood123

작성한 질문수 13

0

캐싱이 매번 deserlizeUser로 데이터 조회하지 않도록 객체를 만들어 거기에 유저의 데이터를 저장해서 사용하는 걸로 보입니다.

그렇다면 단순히 유저의 id만 저장해야 하나요 아니면 팔로잉테이블, 좋아요 테이블 등 전부 가져와야 하는 건가요?

 

let cash = {};
    passport.deserializeUser((id, done) => {
        if(!cash) {
        User.findOne({
            where: { id },
            include: [{
                model: User,
                attributes: ['id', 'nick'],
                as: 'Followers',
            }, {
                model: User,
                attributes: ['id', 'nick'],
                as: 'Followings',
            }],
        })
      .then(user => done(null, user))
        .then(cash => cash = req.user)
        .catch(err => done(err));
        }
        else {
            done(null, cash);
        }
  });

이렇게 간단하게 코드를 짜봤습니다.

cash객체를 선언하고 cash가 NULL이면

.then(user => done(null, user))

이 코드에서 user 데이터를 req.user에 저장하기에 그 아래에 바로

cash = req.user로 데이터를 집어 넣습니다

그다음 cash가 NULL이 아니면 cash를 done합니다

그러나

Cannot read properties of undefined (reading 'length')

이러한 오류가 발생하는데 

res.locals.followerCount = req.user ? req.user.Followers.length : 0;

오류가 난 코드는 이 코드 입니다.

 

실은 간단히 쳐본거라 접근방법이 틀린것 일수도 있지만 캐싱에 저장할 데이터가 너무 모호해서 질문 올립니다.

 

다른 스스로 해보기는 앞에서 한 작업에서 응용하는 거라  접근방법이 어느정도 다가오는데 캐싱하기는 제가 하는 접근이 맞는지 틀린지조차 애매합니다;;

Sequelize mysql mongodb nodejs

답변 1

0

제로초(조현영)

.then(cash => cash = req.user)

이게 잘못되었습니다. 여기 매개변수를 cash로 줘버리면 위에 let cash랑 다른 cash입니다.

그리고 req.user가 비동기로 생긴다면 req.user도 undefined입니다. cash에 user를 넣으세요.

참고로 캐쉬 스펠링은 cache입니다.

0

wdhgood123

.then(cache = user)

이렇게 주면

Cannot read properties of undefined (reading 'length')

똑같이 이런 에러가 뜹니다

user에 커서를 대보면 user의 이름을 찾지 못했다고 뜹니다

.then(user => cache = user)

이렇게 해봐도 똑같은 에러가 발생합니다

.then(user => done(null, user))

이 user는 매개변수인가요? 찾은 User의 데이터 아닌가요?

 

 

사실 좀 이상한게 deserializeUser는 첫 로그인을 serialize로 받아서 세션을 저장해야만 호출되는것이 아닌가요? 왜 첫 화면부터 저렇게 에러가 뜨는지도 모르겠습니다

 

 

 

0

제로초(조현영)

처음 것은 문법이 틀렸습니다.  뒤에 두 개는 문법은 올바른데 올바른 then의 사용법이 아닙니다.

Promise 문법을 공부하셔야 될 것 같습니다.

0

wdhgood123

let cache = {};
    passport.deserializeUser((id, done) => {
        if(!cache) {
        User.findOne({
            where: { id },
            include: [{
                model: User,
                attributes: ['id', 'nick'],
                as: 'Followers',
            }, {
                model: User,
                attributes: ['id', 'nick'],
                as: 'Followings',
            }],
        })
        .then(user => {
            done(null, user);
            return resolve(user);
      })
        .then( user => cache = user)
        .catch(err => done(err));
        } else {
            done(null, cache);
        }
  });

이렇게 바꿔서 해봤지만

Cannot read properties of undefined (reading 'length')

똑같은 에러가 나옵니다.

 

전 이 에러가 나오는 이유가 req.user를 저장하지 못해서 에러가 난 것이라고 판단했는데

왜 이런 에러가 나온것 일까요??

 

0

제로초(조현영)

if (!cache)는 무조건 false입니다. !{}는 무조건 false거든요.

리눅스 노드 설치시 패키지

0

159

0

socket.js 에서 referer로부터 roomId를 가져올 때

0

906

3

스트리밍 방식으로 대용량 파일 업로드 & 다운로드 관련 질문

0

2281

2

a[title] 질문드립니다

0

375

1

리뉴얼 강의 및 공부 방법

0

581

1

jwt decode

0

1128

1

node.js 교과서 3판 질문드립니다

0

391

1

passport와 jwt

0

432

1

리뉴얼 강의

0

419

2

혹시 Node.js 교과서 3판 이북은 언제 나오나요?

0

353

1

몽고디비 사용자도 MYSQL부분을 들어야 하나요???

0

481

1

sql 쿼리 로그는 어떤 모듈이 작성하나요?

0

505

2

nunjucks res.render('error'); 작동을 안합니다.

0

511

1

질문있습니다.

0

346

1

multer 한글 파일 업로드시 파일명이 깨져요.

1

3535

1

수업자료는 어디있나요?

0

366

1

질문 있습니디

0

235

1

multer 사용시 file 외 name값은 못받나용?

0

416

1

코드 중복 부분 질문드립니다.

0

298

1

api 만드는 이유 질문드립니다.

0

287

1

Strategy의 done에 대해 질문드립니다.

0

364

1

안녕하세요 fs 권한 관련 질문드립니다

0

449

1

시퀄라이즈 연결질문...

0

496

2

res.setHeader vs res.cookie

0

1786

3