skydum

個人的な作業記録とか備忘録代わりのメモ

Dev ContainerでNode.js + Redisを使う

Dev Container(Node.js + Redis セットアップ)

最近Node.jsとRedisの組み合わせが増えてきた。 来年も結構上記の組み合わせが増えるはず…。
非同期で定期実行される処理が複数あり、処理される順番が大事なのに非同期で処理されるのでとてもややこしい。
あんまり触ったことがなかったので勉強しようと思うので、環境を構築した。
明日Redisを触ってみようかと思う。

前提条件

VS CodeからDevContainerを使って環境を構築するので、dockerが入っていることが前提で以下のファイルを準備する。

.
├── .devcontainer
│   ├── compose-dev.yaml
│   ├── devcontainer.json
│   └── Dockerfile
├── .vscode
├── node_modules
└── src
    ├── index.js
    ├── .gitignore
    ├── compose.yml
    └── Dockerfile
├── LICENSE
├── package-lock.json
├── package.json
└── README.md

Dev Containerの起動

ファイルを作成してVS Codeでフォルダを開くとDev Containerで開くって出てくるので、開いたら完了。
コンテナを再度ビルドし直すときはコマンドパレット(CTRL+SHIFT+P)でDev Containerの再ビルドをすればOK。

コード

.devcontainer/compose-dev.yaml

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ../:/workspace
    depends_on:
      - redis
    ports:
      - "3000:3000"
  redis:
    image: "redis:latest"
    ports:
      - "6379:6379"

.devcontainer/devcontainer.json

{
    "name": "Node.js & TypeScript (Latest) with Redis",
    "dockerComposeFile": [
        "compose-dev.yaml"
    ],
    "forwardPorts": [
        3000,
        6379
    ],
    "workspaceFolder": "/workspace",
    "service": "app"
}

.devcontainer/Dockerfile

FROM node:23.5.0

RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
    && apt-get -y install --no-install-recommends git wget curl

WORKDIR /workspace

RUN npm install -g npm@latest

COPY ../package*.json ./

EXPOSE 3000

CMD ["/bin/bash", "-c", "while sleep 1; do :; done"]

src/index.js

  • Geminiに書いてもらったサンプルコード
import { createClient } from "redis";

// Redisクライアントの作成
const client = createClient({
    url: "redis://redis:6379"
});

client.on("connect", () => {
    console.log("Redisに接続しました。");
});

client.on("error", (err) => {
    console.error("Redis接続エラー:", err);
});

async function main() {
    try {
        await client.connect();

        // データの保存
        await client.set("mykey", "Hello from Node.js and Redis with TypeScript!");
        console.log("データが保存されました。");

        // データの取得
        const value = await client.get("mykey");
        console.log("取得したデータ:", value);

        // データの削除
        await client.del("mykey");
        console.log("データが削除されました。");

        // 存在しないキーの取得
        const nonExistentValue = await client.get("nonExistentKey");
        console.log("存在しないキーの値:", nonExistentValue); // null が返る

        // Hashデータの保存と取得
        await client.hSet("user:123", {
            name: "John Doe",
            email: "john.doe@example.com"
        });
        const user = await client.hGetAll("user:123");
        console.log("取得したハッシュデータ:", user);


    } catch (error) {
        console.error("エラーが発生しました:", error);
    } finally {
        // Redisクライアントのクローズ
        await client.quit();
        console.log("Redisクライアントを閉じました。");
    }
}

main().catch(error => console.error("main function error", error));