Redis+Docker-compose+Nodejs+Express

タイトルな環境を今回構築しましたが、結構はめられました。。。
session管理には、もともとはデータ用のDBである、Postgresqlに同居させていました。
しかし、以前より「いつかはRedis」と考えていて、今回チャレンジしてみました。

docker-composeの設定

version: '3'

services:
  redis:
      image: "redis:latest"
  ports:
    - "6379:6379"
  volumes:
    - "./redis:/data"

postgres:
  image: postgres:12.3
  :省略
app:
  build:
    context: ./docker/construct_app # Dockerfile保存場所 contextでDockerfileの保存場所を相対パスで指定する
    dockerfile: Dockerfile-app # Dockerfileファイル名
    ports: # ポート接続
        - 3005:3000
    volumes: # mount workdir
        - ./sapp:/src
    environment:
      - TZ="Asia/Tokyo"
      - REDIS_HOST=redis
      - REDIS_PORT=6379
    command: [sh, -c, npm install && npm start]
  :省略

こんな感じです。

モジュールのインストール

npm install redis –save
npm install connect-redis –save

ソースの編集

const redis = require( 'redis' );
const RedisStore = require( 'connect-redis' )( session );
const redisClient = redis.createClient({
  url: redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT},
  legacyMode: true
});
(async () => {
  await redisClient.connect().catch("app.js:" + console.error);
})();

app.use(session({
  store : new RedisStore({
    client : redisClient
  }),
  secret : 'seacret-key', // Cookieの暗号化に利用するキー
  resave : false, // true:セッション内容に変更がない場合にも保存する
  saveUninitialized : false, // true:新規にセッションを生成して何も代入されていなくても値>を入れる
  cookie : {
    httpOnly : false, // cookieへのアクセスをHTTPのみに制限しない
    secure : false,
    maxAge : 60 * 60 * 1000 // クッキーの有効期限(msec)
  }
}));

ハマったところ。。。。

1)createClientでパラメータなしは接続しない
localhostに接続に行こうとして、docker環境ではconnection refuseとなります。
今回は環境変数でホストとポートを指定しています。

2)legacyModeは必要です。
接続はできたのですが、アクセスすると戻ってきません。
legacyModeの設定をすれば、戻ってくるようになりました。

3)connectが必要です。
何箇所かのサイトでconnectionの記載がありませんでした。
最初そのようにして接続できずにしました。
考えれば当たり前のことなんでしょうけど(^^;

あとはセッションチェックの処理やらがありますが、ここでは割愛します。
もともとPgsessionで動いてたやつなんで、これ以上は手を入れなくてもいい・・・はず(^^;

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です