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