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));