前回は開発環境としてDockerを採用し、そこにGitやNode.js、PostgreSQLをインストールする所まで実践しました。
前回の記事
本記事ではNode.jsを使ってAPI構築からサーバーの起動まで実施します。
最終要件の確認
以下が、あなたが目指している「全国のフリーランスや日々勉強している人々が気軽につながれるサービス」の要件です。
最終的な要件
トップ画面とインタラクション
- 日本地図を表示し、地方ごとにクリックで都道府県リストを表示。
- 都道府県を選択すると該当エリアの情報画面を表示。
ユーザー登録・ログイン機能
- メールアドレス・SNSアカウント(Google, Facebook, Twitter など)での登録。
- ユーザープロフィール(名前、スキル、自己紹介)を登録可能。
ユーザー同士のマッチングと検索機能
- 地域やスキルタグを基にプロフィール検索が可能。
- 興味に基づくマッチング機能。
評価システム
- 星評価(1〜5) やレビューコメントで相互評価。
- 良い評価を受けると「評価スコア」が高くなる仕組み。
メッセージ機能
- 個別チャット機能。
- メッセージの通知機能。
活動記録の管理
- 共同作業やイベント参加履歴を記録。
管理者機能
- 管理者用ダッシュボード。
- 不正ユーザーの監視・報告対応機能。
UI/UX 要件
- レスポンシブデザイン対応。
- 地図上で直感的な操作ができるインターフェース。
技術要件
- フロントエンド: Next.js など(あなたの選択は Node.js ベース)。
- バックエンド: Node.js(Express.js など)。
- データベース: PostgreSQL。
- ホスティング: Docker環境で統合し、クラウドへデプロイ可能に。
次にやるべきこと
1. 基本的なディレクトリ構造の準備
やること:
フロントエンド(Next.js など)とバックエンド(Express.js など)のファイル構造を準備します。
例:
my-docker-project/
├── app/ # フロントエンドディレクトリ
├── backend/ # バックエンドディレクトリ
├── docker-compose.yml # Docker Compose設定ファイル
├── Dockerfile-git # Git用Dockerfile
└── README.md # プロジェクト概要
2. バックエンド開発の開始(API構築)
やること:
Express.js のセットアップ:
cd backend
npm init -y
npm install express body-parser cors
サーバーファイル作成: backend/server.js
を作成し、以下のコードを追加します。
const express = require('express');
const app = express();
const port = 5000;
app.use(express.json());
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
3. フロントエンド開発の開始
やること:
Next.js プロジェクトの作成:
cd app
npx create-next-app@latest .
トップページに日本地図を表示する準備:
- 画像ベースの地図を配置し、各地方のリンクを設置します。
- 必要なら JavaScript の地図ライブラリ(例: Leaflet.js)をインストール。
4. PostgreSQL データベースの準備
やること:
必要なテーブルを作成する SQL ファイルを用意します。
例: backend/database/schema.sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(100),
skill_tags TEXT[],
bio TEXT
);
CREATE TABLE messages (
id SERIAL PRIMARY KEY,
sender_id INT,
receiver_id INT,
message TEXT,
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
5. ユーザー認証機能の構築
やること:
JWT(JSON Web Token) を使用して認証システムを実装します。
npm install jsonwebtoken bcryptjs
6. データベースとバックエンドの接続
やること:
PostgreSQL に接続するため、pg
パッケージをインストールします。
npm install pg
接続設定をバックエンドに追加します。
const { Pool } = require('pg');
const pool = new Pool({
user: 'myuser',
host: 'localhost',
database: 'mydatabase',
password: 'mypassword',
port: 5432
});
7. Docker Compose で統合テストを実行
フロントエンド、バックエンド、データベースの動作確認を行います。
docker-compose up -d
まとめ
今後の主なタスク:
- ディレクトリ構成の準備。
- バックエンド開発(Express.js)。
- フロントエンド開発(Next.js で地図表示)。
- データベースのセットアップ(PostgreSQL)。
- ユーザー認証機能の実装。
- 全体の統合テスト。
各ステップでの問題や疑問があればお気軽にお知らせください!😊
具体的なやるべきことがわかったので早速着手します。
プロジェクトで使うフォルダを用意する
ChatGPTでは下記のような構造でフォルダを用意するとのことでした。
実際にテキストエディタ「Cursor」で「my-docker-project」までアクセスし、指定されたフォルダとファイルを作成します。
こんな感じですね。READMEには本企画の詳細を記載しておきます。
バックエンド開発の開始(API構築)
次にNode.jsを使ったAPI構築を行います。これはサーバーサイドアプリの基本機能を設定して外部からのリクエストを受け取り、それに応じて適切なレスポンスを返せるようにする環境を作ることです。
もちろんAPI構築の知識はないのでChatGPTの手順通りひたすら手を動かしていきます。
まずは「my-docker-project」フォルダへ移動して下記のコマンドを実行します。
docker-compose up -d
次にDockerのコンテナに入ってLinuxコマンドを実行するため、下記のコマンドを実行します。
docker exec -it node-container bash
ここでエラー発生
Error response from daemon: container hogehogehogehogehoge is not running
こういうエラーは個人情報を変更(上記はhogehogeに変更しています。)し、ChatGPTへ直接指定します。
解決方法
1. 現在のコンテナの状態を確認
コンテナが起動しているか確認するために、以下を実行してください:
docker ps -a
出力例:
CONTAINER ID IMAGE STATUS PORTS
73ef16018c03 node:18 Exited (0) About a minute ago ...
STATUS
に Exited
と表示されている場合、そのコンテナは停止しています。
2. コンテナの再起動
停止しているコンテナを再起動するには、以下のコマンドを実行します:
docker start node-container
その後、bash セッションに入るコマンドを実行します:
docker exec -it node-container bash
ChatGPTに教えてもらったコマンドを実行するもうまくいかず、Dockerの状態をチェックするために下記のコマンドを実行します。
docker ps -a
そこで表示されたエラーコードをまたChatGPTへ送信。これをひたすら繰り返します。その結果、下記の内容が原因だという言ことがわかりました。
原因として考えられること
- server.js などのサーバープロセスがない:
node-container
にサーバーの起動スクリプトが存在しないため、何もせず終了している。
- docker-compose.yml の設定にコマンドが不足:
command: ["node", "server.js"]
のような永続的なプロセス起動が指定されていない場合、Node.jsコンテナはすぐ終了します。
そもそもフォルダとファイルを用意しただけなので、上記の環境は全く作っていませんでした。なのでこれらを用意する方法もChatGPTへ聞いて実行します。
ChatGPTの指示に従い、上記のようにCursorを使ってserver.jsとその内容を作成しました。ほかにもexpressのインストールなど指定された内容を実行します。
その結果、何とか上記のようにNode.jsサーバーを動かし、リクエストに対してServer.jsに記載した内容を返すことができました。
おそらくこれでAPI構築は完成なので、次にフロントエンド開発へ進みます。
エラー多発で一旦企画を練り直し
API構築が終わった翌日に、再度Dockerを起動してコンテナへアクセスしようとしましたが、エラーで中々つながりませんでした。これまでと同じくChatGPTへ質問を繰り返して試行錯誤するも、下記のエラーを一向に突破できません。
Server running at http://localhost:3000
node:events:495
throw er; // Unhandled 'error' event
^
Error: listen EADDRINUSE: address already in use 0.0.0.0:3000
at Server.setupListenHandle [as _listen2] (node:net:1817:16)
at listenInCluster (node:net:1865:12)
at doListen (node:net:2014:7)
at process.processTicksAndRejections (node:internal/process/task_queues:83:21)
Emitted 'error' event on Server instance at:
at emitErrorNT (node:net:1844:8)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
code: 'EADDRINUSE',
errno: -98,
syscall: 'listen',
address: '0.0.0.0',
port: 3000
}
Node.js v18.20.5
}
上記のエラーコードは3000番ポートがすでに使用されており、サーバーを起動できないことを指しています。このエラーを解決するためにChatGPTを活用し、下記の方法を実施しました。
- docker-compose.ymlのホスト側ポートを3001へ変更
- すべてのDockerリソースをリセット
- 実行しているポートをチェック
- 全てのコンテナを停止・削除して再構築
ChatGPTを活用して上記の処理を実行しましたが、結局3000ポートのエラーを解消できませんでした。エラー処理にかなりの時間を要したのですが、これ以上時間をかけられないと判断し、Dockerではないほかの開発環境を利用することにします。
今回Dockerを採用してうまくいかなかった理由を自分なりに振り返った結果、Dockerの構造に詳しくないためエラーの明確な原因を想定できなかったという結論に落ち着きました。
AIでDockerの構築をサポートすることは可能ですが、基本的な仕組みがわかっていないと柔軟に対応できないことを実感しています。
別の環境構築を整えて再度挑戦
気を取り直して、ほかに最適な環境についてChatGPTへ聞いてみました。
開発でつまずいてしまい、気持ちが疲れてしまったようですね。Dockerは便利ですが、設定が複雑な部分もあるため、特に初期段階ではトラブルが発生しやすいです。ただ、Docker以外にも柔軟で効率的な方法があります。
以下の代替方法をご提案します。
~省略~
まとめ
手軽に始めたい場合:ローカル環境に Node.js、PostgreSQL を直接インストール。
仮想環境で隔離したい場合:Vagrant か WSL。
ブラウザ上で開発する場合:GitHub Codespaces や Replit などのクラウドIDE。
オールインワン環境が欲しい場合:XAMPPを使用。
Dockerなしでも柔軟に開発する方法は多くあります。特に クラウドIDE や WSL はセットアップが簡単で、初心者にも扱いやすいです。気になる方法があれば、詳しい手順をお伝えしますので、教えてください!
上記の選択肢にある「ローカル環境に直接インストール」という方法は、前回の記事で1度実施しています。
前回の記事
とはいえローカル環境に作ると、リリースするときにまたひと手間必要という理由でDockerの利用へ切り替えました。
しかし今回は一旦リリースの前に、環境を作ってWebサービスを構築することを前提とし、ローカル環境を利用することにします。
【ここまでのまとめ】Webサービス開発はIT知識がないと厳しい
今回はNode.js、PostgreSQL、GitをDockerコンテナに組み込むことで、環境を分離し柔軟な開発環境を試みました。しかしコンテナの設定エラーやポート競合の問題などで多くの時間を使い、結果としてうまくいきませんでした。
この結果からエラーの特定や対処方法をスムーズに進めるためには、Dockerそのものの理解やLinuxコマンドの基本知識が不可欠であることを痛感しています。
今回の経験からWebサービス開発はIT知識なしで始めるのは難しいものの、試行錯誤を通じて一歩ずつ知識やスキルを身に付ける必要性が感じられました。ITが社会のインフラとなっている以上、IT知識の重要性は高いと考えられます。
Trendsを運営しているコードキャンプ株式会社では、企業向けのDX研修やIT研修などのリスキリングプログラムを実施しています。企業に合わせた完全オーダーメイドの研修を提供しており、上記のデジタルスキルとソフトスキルを組み合わせた研修も対応可能です。
「CodeCamp」が提供するDX研修の事例
「自社に最適なIT研修やDXの取り組みがわからない…」という相談にも対応しているので、詳しく知りたい方は気軽にお問い合わせください。
次回はローカル環境を活用し、よりシンプルな方法でWebサービスの構築を進めていきます。