인프런 커뮤니티 질문&답변

wdhgood123님의 프로필 이미지
wdhgood123

작성한 질문수

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

캐싱 간단한 질문입니다

작성

·

179

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;

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

 

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

 

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

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

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

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

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

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

wdhgood123님의 프로필 이미지
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로 받아서 세션을 저장해야만 호출되는것이 아닌가요? 왜 첫 화면부터 저렇게 에러가 뜨는지도 모르겠습니다

 

 

 

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

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

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

wdhgood123님의 프로필 이미지
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를 저장하지 못해서 에러가 난 것이라고 판단했는데

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

 

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

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

wdhgood123님의 프로필 이미지
wdhgood123

작성한 질문수

질문하기