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で動いてたやつなんで、これ以上は手を入れなくてもいい・・・はず(^^;


