connect-redisをDockerで使うときに躓いた

9973 ワード

node.jsのconnect-redisを使うときに躓いたので、その解決策を備忘録として共有します。

redis@v4を使っています。
オフィシャルページ[1]の以下のコード

index.js
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:[email protected]:6380'
});

と書かれています。この通りにやってみます。
URLの中身はredis[s]://[[username][:password]@][host][:port][/db-number]です[2:1]
URL形式なので、"/"や"+", "&", "?"などURLで意味を持つ記号はパスワードに入れないようにしましょう(これに気づくのに時間を費やし、無駄な時間を過ごしました…無念)
ちなみに、デフォルトのユーザー名はdefaultです。
また、legacyModeを追加しないと、うまくstoreのプロセスから抜けられないのか、ページのロードが永遠に終わりません。必ずlegacyMode:trueにしてください。
host名はlocalhostではなく、docker-compose.ymlに記載した名前を入れます。
例えば、以下のようなコードにすれば、動きました。

index.js
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)

脚注
  1. connect-redis (Github) https://www.npmjs.com/package/connect-redis (2022-04-14閲覧) ↩︎

  2. redis (npm) https://www.npmjs.com/package/redis (2022-04-14閲覧) ↩︎ ↩︎