connect-redisをDockerで使うときに躓いた
node.jsのconnect-redisを使うときに躓いたので、その解決策を備忘録として共有します。
redis@v4を使っています。
オフィシャルページ[1]の以下のコード
const session = require("express-session")
let RedisStore = require("connect-redis")(session)
// redis@v4
const { createClient } = require("redis")
let redisClient = createClient({ legacyMode: true })
redisClient.connect().catch(console.error)
app.use(
session({
store: new RedisStore({ client: redisClient }),
saveUninitialized: false,
secret: "keyboard cat",
resave: false,
})
)
を使いましたが、docker-composeを使って、コンテナを建てると、うまく動きません。
パスワードを設定するのも抜けているので、そこも気になります。
この設定では、localhostにつながってしまうので、npm redisのページ[2]にいって、調べると
createClient({
url: 'redis://alice:foobared@awesome.redis.server:6380'
});
と書かれています。この通りにやってみます。
URLの中身はredis[s]://[[username][:password]@][host][:port][/db-number]
です[2:1]。
URL形式なので、"/"や"+", "&", "?"などURLで意味を持つ記号はパスワードに入れないようにしましょう(これに気づくのに時間を費やし、無駄な時間を過ごしました…無念)
ちなみに、デフォルトのユーザー名はdefaultです。
また、legacyModeを追加しないと、うまくstoreのプロセスから抜けられないのか、ページのロードが永遠に終わりません。必ずlegacyMode:trueにしてください。
host名はlocalhostではなく、docker-compose.ymlに記載した名前を入れます。
例えば、以下のようなコードにすれば、動きました。
const RedisStore = require("connect-redis")(session);
// redis@v4
const { createClient } = require("redis")
console.log(env.REDIS_PASS);
// let redisClient = createClient({host: 'redisdb', port: 6379, legacyMode: true, password: env.REDIS_PASS })
let redisClient = createClient({url: `redis://${env.REDIS_USER}:${env.REDIS_PASS}@${env.REDIS_HOST}:${env.REDIS_PORT}`, legacyMode: true})
redisClient.connect().catch(console.error);
REDIS_USER=ユーザー名(デフォルトはdefault)
REDIS_PASS=パスワード
REDIS_HOST=ホスト名
REDIS_PORT=ポート番号(デフォルトは6379)
-
connect-redis (Github) https://www.npmjs.com/package/connect-redis (2022-04-14閲覧) ↩︎
-
redis (npm) https://www.npmjs.com/package/redis (2022-04-14閲覧) ↩︎ ↩︎
Discussion