LoginSignup
1
1

More than 1 year has passed since last update.

Express redis Docker

Posted at

はじめに

備忘録です。
expressでapiを構築しています。
settion管理にredisを使います。

前提

package.jsontype: "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を使うのをお勧めします。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1