Node.js/Express.js

[Express - Redis Cloud] Redis 연결 오류 (ClientClosedError: The client is closed)

턴태 2022. 8. 11. 14:25

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을 사용하거나 해도 정상적으로 사용할 수 있다.