0%

Node.Js에서 Redis 세션 사용시 UnhandledPromiseRejectionWarning The client is closed 문제 뜨는 경우

세션을 사용하려다가…

Node.JS에서 세션을 사용하려 했고, 저장소로 레디스(Redis) 를 사용하기로 했다.
설정법은 다음 포스팅에서 다루기로 하고…
일단 내가 쓰려 했던 패키지는 아래와 같다.

1
2
3
"redis": "^4.0.3",
"express-session": "^1.17.2",
"connect-redis": "^6.0.0",

이렇게 설정하고 redis 설정을 해줬다.
참고로 설정 파일을 외부로 빼고 app.use() 에서 넣어서 쓰는 방식으로 개발했다.
이 부분을 참고하면 될 것 같다.
그리고 설정파일의 경우 전체 정보를 공개하기 어렵기에 공통적인 부분만 남긴다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* Redis 설정
*/

import connectRedis from "connect-redis";
import redis from "redis";

export function getSession(session) {
const RedisStore = connectRedis(session);
const redisClient = redis.createClient({
// url: "redis://127.0.0.1:10",
host: "127.0.0.1",
port: 10,
password: "0000",
});

redisClient.unref();
redisClient.on("error", console.log);

const sessionInfo = {
resave: false,
saveUninitialized: false,
secret: "sessionSecret",
name: "sessionId",
cookie: {
httpOnly: true,
secure: true,
},
store: new RedisStore({ client: redisClient }),
};
return session(sessionInfo);
}

위와 같이 설정된 상태에서 node.js를 실행할 경우 아래와 같은 에러가 발생했다.

1
2
3
[app] [2022-01-27T15:49:44.924Z] Server running to http://localhost:11 in dev
(node:45453) UnhandledPromiseRejectionWarning: Error: The client is closed
....

이런 문제가 발생하는 원인은 버전 문제다.
바로 connect-redis 패키지 문제이다.

NPM 사이트 에서도 확인 가능하지만 일부 내용을 발췌하면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
RedisStore(options)
The RedisStore requires an existing Redis client. Any clients compatible with the redis API will work. See client option for more details.

Options
client
An instance of redis or a redis compatible client.

Known compatible and tested clients:

redis (v3, v4 with legacyMode: true)

요기서 보면 redis를 사용할 때 v4를 사용할 경우 legacyMode를 사용해서 쓰라 되어 있다.
난 redis 버전을 낮췄다.

“redis”: “v3”

무튼 해결법은…

  1. redis 버전을 낮춘다.
  2. legacyMode를 활성화 한다.

이 두가지를 조취한 다음 실행하면 아주 잘 된다.

별거 아닌걸로 시간을 좀 많이 쓰니 답이 안보인다….-_-;;