はじめに
備忘録です。
expressでapiを構築しています。
settion管理にredisを使います。
前提
package.json
でtype: "module"
を指定しています。
typescriptは導入していません
dockerを読める前提です
version: "3.8"
services:
api:
build:
context: ./api
dockerfile: ./Dockerfile
env_file: ./api/.env
tty: true
depends_on:
- redis
volumes:
- ./api:/usr/src/app
ports:
- "3000:3000"
environment:
- TZ=Asia/Tokyo
redis:
image: "redis:latest"
restart: always
ports:
- "6379:6379"
volumes:
- "./data/redis:/data"
import express from "express";
import session from "express-session";
import Redis from "ioredis";
import RedisStore from "connect-redis";
// クライアント作成
const redis = new Redis({
port: 6379,
// service名を指定
// コンテナ間通信じゃない場合 127.0.0.1(local)
// redisだけコンテナでapiがローカルの場合も 127.0.0.1でOKです
host: "redis",
});
const app = express();
// proxyを信頼
app.set("trust proxy", 1);
app.use(
session({
name: "session",
secret: "secret_key",
// セッションストレージ作成
store: new RedisStore({ client: redis }),
resave: false,
saveUninitialized: false,
cookie: {
sameSite: "none",
secure: true,
httpOnly: false,
maxAge: 1000 * 60 * 30,
},
})
);
app.get("/", (req, res) => {
if (!req.session.views) {
req.session.views = 0;
}
req.session.views++;
res.json({ message: `${req.session.views}回目の来訪です` });
});
app.get("/logout", (req, res) => {
req.session.destroy((err) => {
res.json({ message: "logout" });
});
});
app.listen(3000, console.log("サーバーを開始します"));
おわりに
typescriptを使う場合 sessionの型定義が必須
declare module 'express-session' {
interface SessionData {
firstAccessTime: string;
counter: number;
message: string;
}
}
redisを使うためのredisクライアントは redis
ioredis
の2つがあります。
基本的にredis
で書かれた記事が多い気がしますが、最近version
が上がり、大きく仕様が変わったようで、
情報が少ない + 互換性がないという情報をチラッと見ました。
ioredis
を使うのをお勧めします。