2025年9月26日 星期五

AIOT_Server 建立 Node.js 專案啟動流程

 AIOT_Server 專案建立一個專業且標準的 Node.js 專案啟動流程

這個流程將遵循您的技術棧(Node.js, Express, MySQL, Redis, MQTT)和部署要求(Docker Compose),確保程式碼的穩定性、可維護性及與各服務的連線正確性。


Node.js 專案 (gg1_node) 啟動流程設計

1. 專案初始化與結構

在開始撰寫程式碼之前,先建立一個標準化的專案結構:

  1. 初始化專案:

    Bash
    mkdir gg1_node
    cd gg1_node
    npm init -y
    
  2. 安裝核心依賴套件:

    Bash
    # 核心 Web 框架、資料庫、環境變數
    npm install express mysql2 ioredis dotenv bcryptjs jsonwebtoken
    
    # 開發依賴 (Dev Dependencies)
    npm install -D nodemon # 開發時自動重啟
    
  3. 建議的檔案結構:

    gg1_node/
    ├── node_modules/
    ├── .env                # 環境變數設定 (開發用)
    ├── .gitignore
    ├── package.json
    ├── server.js           # 專案主入口 (啟動流程核心)
    ├── config/
    │   ├── db.js           # 資料庫 (MySQL) 連線配置
    │   ├── redis.js        # Redis 連線配置
    │   └── mqtt.js         # MQTT Broker 連線配置
    ├── controllers/        # 處理業務邏輯 (例如 userController.js)
    ├── models/             # 資料模型 (例如 userModel.js)
    ├── routes/             # 路由定義 (例如 authRoutes.js, apiRoutes.js)
    └── services/           # 外部服務 (例如 emailService.js, authService.js)
    

2. 核心啟動腳本 (server.js)

server.js 應該專注於環境準備服務連線的初始化工作,確保所有依賴服務都準備就緒後,才啟動 Web Server 監聽請求。

啟動流程步驟:

  1. 載入配置與環境變數:確保 .env 檔案中的變數(如 DB 連線字串、Port 號、JWT Secret)被正確載入。

  2. 初始化資料庫連線 (MySQL):測試與 MySQL 資料庫的連線,如果連線失敗,則中斷啟動並報告錯誤。

  3. 初始化快取/Token 服務 (Redis):測試與 Redis 服務的連線,確保 Email 驗證 Token 可以被存取。

  4. 初始化 MQTT 連線 (Broker):連線到 Mosquitto Broker,並設定基本的訂閱 (Subscribe) 處理器。

  5. 啟動 Express 伺服器:開始監聽指定的 Port 號,並準備處理外部請求。

JavaScript
// server.js 範例程式碼

require('dotenv').config(); // 步驟 1: 載入環境變數
const express = require('express');
const app = express();
const { connectMySQL } = require('./config/db');     // 假設您在 config/db.js 中定義了連線函數
const { connectRedis } = require('./config/redis'); // 假設您在 config/redis.js 中定義了連線函數
const { connectMQTT } = require('./config/mqtt');   // 假設您在 config/mqtt.js 中定義了連線函數
const authRoutes = require('./routes/authRoutes');

const PORT = process.env.PORT || 3000;

// Middleware 設定
app.use(express.json()); // 處理 JSON 格式的請求體

// 路由設定
app.use('/api/auth', authRoutes); // 註冊、登入、驗證等路由

/**
 * 專案啟動主函數
 */
async function startServer() {
    try {
        // 步驟 2: 初始化資料庫連線 (MySQL)
        await connectMySQL();
        console.log('✅ MySQL 資料庫連線成功');

        // 步驟 3: 初始化快取服務 (Redis)
        await connectRedis();
        console.log('✅ Redis 連線成功');

        // 步驟 4: 初始化 MQTT 連線
        await connectMQTT();
        console.log('✅ MQTT Broker 連線成功');

        // 步驟 5: 啟動 Express 伺服器
        app.listen(PORT, () => {
            console.log(`🚀 AIOT Server 成功啟動,監聽 Port ${PORT}`);
            console.log(`   (服務名稱: gg1_node)`);
        });
        
    } catch (error) {
        console.error('❌ 伺服器啟動失敗,關鍵服務無法連線或初始化:', error.message);
        // 如果關鍵服務 (DB/Redis/MQTT) 失敗,通常應退出應用程式
        process.exit(1); 
    }
}

startServer();

3. package.json 啟動指令

為了配合 PM2Docker,設定好啟動指令:

JSON
// package.json 的 scripts 部分
"scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js",
    "pm2": "pm2 start server.js --name gg1_node --watch"
},
指令用途
npm start生產環境Docker 容器中的標準啟動指令 (使用 PM2 則替換為 pm2 start)。
npm run dev開發環境 使用 nodemon 進行自動重啟。
npm run pm2在樹莓派上直接使用 PM2 啟動並監控服務。

透過這個流程,您可以確保您的 Node.js 後端服務gg1_node)在處理任何請求之前,所有的數據庫和 MQTT 服務都是就緒的,從而大大提高系統的穩定性。

接下來,您想先定義 config/db.js 中的 MySQL 連線邏輯,還是 services/emailService.js 中的 Email 驗證發送邏輯?

沒有留言:

張貼留言