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

세션을 사용하려다가…

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

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

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

/**
 * 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를 실행할 경우 아래와 같은 에러가 발생했다.

[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 사이트 에서도 확인 가능하지만 일부 내용을 발췌하면 다음과 같다.

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를 활성화 한다.

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

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


Written by@MHLab
로또는 흑우집합소 🎲
와인관리, 시음노트, 셀러관리는 마와셀 🥂

🫥 My Service|  📜 Contact|  💻 GitHub