connect-redis의 버전이 올라가면 아래의 코드를 사용할 수 없다.
const expressSession = require("express-session");
const RedisStore = require("connect-redis")(expressSession);
...
app.use(
expressSession({
resave: false,
saveUninitialized: false,
secret: <Your Cookie Secret>,
store: new RedisStore({
url: <Your Redis URL>,
logErrors: true,
}),
})
);
이제 RedisStore에 client가 반드시 주어져야 하기 때문이다. 그래서 RedisStore에 client를 전해주어야 한다.
그래서 코드를 아래와 같이 수정했다.
const expressSession = require("express-session");
const redis = require("redis");
const RedisStore = require("connect-redis")(expressSession);
const client = redis.createClient({
url: <Your Redis URL>,
});
client.connect();
...
app.use(
expressSession({
resave: false,
saveUninitialized: false,
secret: <Your Cookie Secret>,
store: new RedisStore({
client,
logErrors: true,
}),
})
);
redis 패키지를 불러와서 url을 통해 client를 생성하여 연결한다. 그렇게 하여 client를 전달해주었는데, 이번에는ClientClosedError: The client is closed
라고 오류가 발생한다.
이 이유는 redis 패키지와 connect-redis 패키지가 서로 버전 오류로 호환되지 않기 때문이라고 한다. 왜냐하면 v3과 달리 v4에서는 클라이언트가 서버에 자동으로 연결하지 않기 때문이다. 그래서 legacyMode: true를 createClient의 옵션으로 추가하여 호환시켜 주도록 한다. 그래서 최종적으로 아래와 같이 코드를 작성하니 정상적으로 세션 저장소를 사용할 수 있었다.
const expressSession = require("express-session");
const redis = require("redis");
const RedisStore = require("connect-redis")(expressSession);
const client = redis.createClient({
url: <Your Redis URL>,
legacyMode: true,
});
client.connect();
...
app.use(
expressSession({
resave: false,
saveUninitialized: false,
secret: <Your Cookie Secret>,
store: new RedisStore({
client,
logErrors: true,
}),
})
);
이 방법 외에도 ioredis를 사용하거나, 버전을 redis@3을 사용하거나 해도 정상적으로 사용할 수 있다.
'Node.js > Express.js' 카테고리의 다른 글
[Toy Project - Omuk] 5. 데이터베이스 연결 - PostgreSQL (0) | 2022.09.02 |
---|---|
[Toy Project - Omuk] 4. 미들웨어 추가 (0) | 2022.08.31 |
[Toy Project - Omuk] 3. 템플릿 엔진 설치 - 서버 사이드 렌더링 (0) | 2022.08.30 |
[Toy Project - Omuk] 2. 라우트 설정 및 라이브러리 설치 (0) | 2022.08.29 |
[Toy Project - Omuk] 1. Express 설치 (2) | 2022.08.29 |