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