Node.js 搭配 Express.js 可快速建立輕量高效的影片串流伺服器。利用 fs 模組讀取影片檔案,並透過 HTTP 伺服器將影片串流至網頁。設定正確的 HTTP 回應標頭,例如 Content-Type 和 Content-Length,確保瀏覽器能正確解析影片內容。環境變數 PORT 可用於動態設定伺服器埠號,方便在不同環境佈署。Nodemon 工具能自動偵測程式碼變更並重啟伺服器,提升開發效率。最後,文章也提及 Docker 容器化技術,作為佈署微服務的選項,讓應用程式在不同環境保持一致性。

安裝 Express

首先,確保您已經安裝了 Express。您可以透過執行以下命令來安裝 Express:

npm install express

建立 Express 伺服器

接下來,建立一個新的 JavaScript 檔案,例如 index.js,並增加以下程式碼:

const express = require('express');
const app = express();

const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(`Server started on port ${port}`);
});

這段程式碼建立了一個簡單的 Express 伺服器,該伺服器監聽連線埠 3000,並傳回 “Hello World!” 當使用者存取根 URL 時。

啟動伺服器

啟動伺服器,執行以下命令:

node index.js

現在,您可以透過瀏覽器存取 http://localhost:3000/ 來檢視 “Hello World!” 的輸出。

解釋程式碼

以下是對程式碼的詳細解釋:

  • const express = require('express');:載入 Express 函式庫。
  • const app = express();:建立一個新的 Express 應用程式例項。
  • const port = 3000;:定義伺服器監聽的連線埠號。
  • app.get('/', (req, res) => {... });:定義了一個路由處理函式,該函式傳回 “Hello World!” 當使用者存取根 URL 時。
  • app.listen(port, () => {... });:啟動伺服器,監聽指定的連線埠號。

建立一個簡單的 HTTP 伺服器

首先,我們需要建立一個簡單的 HTTP 伺服器。這個伺服器將會監聽 port 3000,並傳回「Hello World!」給瀏覽器。以下是實作這個伺服器的 JavaScript 程式碼:

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(`Example app listening on port ${port}!`);
});

這個程式碼使用 Express.js 框架建立了一個簡單的 HTTP 伺服器。當瀏覽器存取 http://localhost:3000/ 時,伺服器將傳回「Hello World!」。

執行 HTTP 伺服器

要執行這個 HTTP 伺服器,我們需要在終端機中輸入以下命令:

node src/index.js

這個命令將會啟動 Node.js 並執行 index.js 檔案中的程式碼。如果成功,終端機中將會顯示以下訊息:

Example app listening on port 3000!

現在,我們可以在瀏覽器中存取 http://localhost:3000/ 來檢視「Hello World!」。

增加串流視訊功能

接下來,我們需要增加串流視訊功能到這個 HTTP 伺服器中。為了實作這個功能,我們需要建立一個新的路由處理器,該處理器將會傳回串流視訊。以下是實作這個功能的 JavaScript 程式碼:

const express = require('express');
const fs = require('fs');
const app = express();
const port = 3000;

app.get('/video', async (req, res) => {
  const videoPath = '../videos/SampleVideo_1280x720_1mb.mp4';
  const stats = await fs.promises.stat(videoPath);

  res.writeHead(200, {
    'Content-Length': stats.size,
    'Content-Type': 'video/mp4',
  });

  fs.createReadStream(videoPath).pipe(res);
});

app.listen(port, () => {
  console.log(`Example app listening on port ${port}!`);
});

這個程式碼使用 fs 模組建立了一個可讀的串流,該串流將會傳回視訊檔案的內容。當瀏覽器存取 http://localhost:3000/video 時,伺服器將會傳回串流視訊。

圖表翻譯:

以下是這個 HTTP 伺服器的架構圖:

  graph LR
    A[瀏覽器] -->|存取 http://localhost:3000/|> B[HTTP 伺服器]
    B -->|傳回 Hello World!|> A
    A -->|存取 http://localhost:3000/video|> B
    B -->|傳回串流視訊|> A

這個圖表顯示了瀏覽器和 HTTP 伺服器之間的互動過程。當瀏覽器存取 http://localhost:3000/ 時,伺服器將傳回「Hello World!」。當瀏覽器存取 http://localhost:3000/video 時,伺服器將傳回串流視訊。

使用 Node.js 與 Express 建立簡單的影片串流伺服器

簡介

在這個章節中,我們將學習如何使用 Node.js 和 Express 框架建立一個簡單的影片串流伺服器。這個伺服器可以從本地檔案系統中串流影片給網頁瀏覽器。

程式碼實作

const express = require('express');
const fs = require('fs');
const app = express();

// 設定 HTTP GET 路由,處理影片串流
app.get('/video', async (req, res) => {
  // 指定影片檔案路徑
  const videoPath = 'videos/example.mp4';
  
  // 取得影片檔案大小
  const videoSize = fs.statSync(videoPath).size;
  
  // 設定 HTTP 回應頭
  res.setHeader('Content-Type', 'video/mp4');
  res.setHeader('Content-Length', videoSize);
  
  // 串流影片
  fs.createReadStream(videoPath).pipe(res);
});

// 啟動伺服器,監聽 port 3000
const port = 3000;
app.listen(port, () => {
  console.log(`伺服器已啟動,正在監聽 port ${port}`);
});

內容解密:

  1. 載入必要模組:我們載入 expressfs 模組。express 用於建立 HTTP 伺服器,而 fs 則提供檔案系統 API。
  2. 設定路由:定義一個 GET 路由 /video,用於處理影片串流。注意使用 async 關鍵字標記此路由為非同步。
  3. 指定影片路徑:定義影片檔案的路徑。在這個例子中,影片位於 videos 子目錄下。
  4. 取得影片大小:使用 fs.statSync 方法取得影片檔案的大小,然後編碼到 HTTP 回應頭中。
  5. 設定 HTTP 回應頭:設定 Content-Typevideo/mp4 以指示瀏覽器這是一個影片檔案,並設定 Content-Length 以指定影片大小。
  6. 串流影片:使用 fs.createReadStream 方法建立一個可讀的串流,然後使用 pipe 方法將其導向 HTTP 回應物件 res,實作影片串流。

圖表翻譯:

  flowchart TD
    A[瀏覽器請求] --> B[Express 路由]
    B --> C[取得影片檔案大小]
    C --> D[設定 HTTP 回應頭]
    D --> E[串流影片]
    E --> F[回應給瀏覽器]

這個流程圖描述了瀏覽器如何請求影片、伺服器如何處理請求、設定回應頭,最後將影片串流給瀏覽器。

建立HTTP伺服器進行視訊串流

為了建立一個簡單的HTTP伺服器來進行視訊串流,我們需要使用Node.js和Express.js。首先,我們需要設定HTTP伺服器的回應標頭,包括內容長度和MIME型別。然後,我們需要建立一個管道來串流視訊檔案。

以下是相關程式碼:

const express = require('express');
const fs = require('fs');
const app = express();

// 設定HTTP伺服器的回應標頭
app.get('/video', (req, res) => {
  const videoPath = 'path/to/video.mp4';
  const videoStat = fs.statSync(videoPath);
  const videoSize = videoStat.size;
  const videoType = 'video/mp4';

  res.writeHead(200, {
    'Content-Length': videoSize,
    'Content-Type': videoType
  });

  // 串流視訊檔案
  const videoStream = fs.createReadStream(videoPath);
  videoStream.pipe(res);
});

在這個範例中,我們使用fs.promises來存取檔案系統,並使用express來建立HTTP伺服器。我們設定HTTP伺服器的回應標頭,包括內容長度和MIME型別。然後,我們建立一個管道來串流視訊檔案。

組態微服務

組態微服務是一個重要的步驟,可以幫助我們更好地使用微服務。在這個範例中,我們需要組態HTTP伺服器的埠號。我們可以使用環境變數來組態微服務。

以下是相關程式碼:

const express = require('express');
const app = express();

if (!process.env.PORT) {
  throw new Error('PORT environment variable is not set');
}

const PORT = process.env.PORT;

app.listen(PORT, () => {
  console.log(`Server started on port ${PORT}`);
});

在這個範例中,我們使用process.env.PORT來存取環境變數PORT。如果環境變數PORT沒有設定,我們會丟擲一個錯誤。否則,我們會使用設定的埠號來啟動HTTP伺服器。

測試微服務

要測試微服務,我們需要啟動HTTP伺服器並存取視訊串流。以下是測試步驟:

  1. 啟動HTTP伺服器:node src/index.js
  2. 存取視訊串流:http://localhost:3000/video

注意:請將3000替換為設定的埠號。

環境變數PORT的設定

在設計Express HTTP server時,我們的程式碼預期會從環境變數中取得PORT的值。這個PORT變數可以被視為一個輸入引數或設定項,讓我們的微服務知道要使用哪個埠號進行通訊。

環境變數PORT的重要性

PORT變數是決定我們的Express HTTP server監聽哪個埠號的關鍵設定。它允許我們在不同的環境中(例如開發、測試、生產)輕鬆地切換埠號,以適應不同的需求。

如何設定環境變數PORT

設定環境變數PORT的方法取決於您的作業系統和佈署環境。以下是一些常見的設定方法:

在Linux或MacOS中

您可以使用export命令來設定環境變數PORT:

export PORT=3000

這將設定PORT變數為3000,您的Express HTTP server就會監聽這個埠號。

在Windows中

您可以使用set命令來設定環境變數PORT:

set PORT=3000

這將設定PORT變數為3000,您的Express HTTP server就會監聽這個埠號。

Express HTTP server的PORT設定

在您的Express應用程式中,您可以使用以下程式碼來設定PORT:

const express = require('express');
const app = express();
const port = process.env.PORT || 3000;

app.listen(port, () => {
  console.log(`Server listening on port ${port}`);
});

這段程式碼會從環境變數PORT中取得埠號,如果沒有設定則預設為3000。然後,它會使用這個埠號啟動Express HTTP server。

內容解密:

上述程式碼使用process.env.PORT來取得環境變數PORT的值。如果沒有設定則使用預設值3000。這樣可以讓我們的應用程式在不同的環境中靈活地切換埠號。

  flowchart TD
    A[取得環境變數PORT] --> B[設定預設埠號]
    B --> C[啟動Express HTTP server]
    C --> D[監聽埠號]

圖表翻譯:

此圖表展示了取得環境變數PORT、設定預設埠號、啟動Express HTTP server和監聽埠號的流程。它清晰地呈現了我們的應用程式如何根據環境變數PORT來決定監聽哪個埠號。

玄貓:環境變數在微服務組態中的重要性

在建立微服務時,組態是一個至關重要的步驟。環境變數(environment variables)是一種組態微服務的有效方式。透過使用環境變數,我們可以在不修改程式碼的情況下,動態地組態微服務的行為。

環境變數的作用

環境變數提供了一種方式,可以在不修改程式碼的情況下,組態微服務的行為。例如,在建立一個HTTP伺服器時,我們可以使用環境變數來指定連線埠號。這樣,我們就可以在不同的環境中,使用不同的連線埠號來啟動伺服器。

組態HTTP伺服器的連線埠號

在下面的例子中,我們使用環境變數PORT來組態HTTP伺服器的連線埠號:

const port = process.env.PORT;
if (!port) {
  throw new Error('請指定HTTP伺服器的連線埠號,以環境變數PORT設定。');
}
const server = http.createServer((req, res) => {
  //...
});
server.listen(port, () => {
  console.log(`伺服器啟動於連線埠${port}。`);
});

如果我們沒有設定PORT環境變數,伺服器將丟擲一個錯誤,提示我們需要設定連線埠號。

設定環境變數

在Linux和macOS上,我們可以使用以下命令來設定環境變數:

export PORT=3000

在Windows上,我們可以使用以下命令:

set PORT=3000

設定環境變數後,我們就可以啟動伺服器了。

多個微服務的組態

當我們有多個微服務需要啟動時,組態不同的連線埠號就變得非常重要。透過使用環境變數,我們可以輕鬆地啟動多個微服務,並指定不同的連線埠號。

管理敏感組態

環境變數也可以用來傳遞敏感的組態訊息,例如資料函式庫密碼或API金鑰。這些訊息不應該被儲存在程式碼中,因為這樣可能會導致安全風險。在第12章中,我們將討論如何管理敏感的組態訊息。

生產環境設定

到目前為止,我們已經設定了微服務在開發電腦上執行的環境。但是,為了讓微服務在生產環境中執行,我們需要進行一些額外的設定。生產環境是指客戶可以存取應用程式的環境。在本章中,生產環境是 Kubernetes,我們將在 Kubernetes 叢集中執行應用程式以使其公開可存取。

安裝生產環境依賴項

為了讓微服務在生產環境中執行,我們需要安裝生產環境依賴項。可以使用以下命令:

npm install --omit=dev

這個命令會安裝生產環境所需的依賴項,並忽略開發環境依賴項。

啟動微服務

為了啟動微服務,我們可以使用以下命令:

npm start

這個命令是啟動 Node.js 應用程式的標準方式。可以在 package.json 檔案中定義啟動指令碼,如下所示:

"scripts": {
  "start": "node src/index.js"
}

這個指令碼會啟動 Node.js 並執行 index.js 檔案。

自動重啟微服務

為了加速開發過程,我們可以使用 nodemon 來自動重啟微服務。可以使用以下命令安裝 nodemon

npm install --save-dev nodemon

然後,可以使用以下命令啟動微服務:

nodemon src/index.js

nodemon 會自動監視程式碼變化,並重啟微服務。

使用 Nodemon 進行微服務開發

Nodemon 是一個 Node.js 的工具,能夠自動偵測程式碼的變化並重新啟動微服務。這使得開發人員可以更快速地看到程式碼變化的效果,提高開發效率。

如何使用 Nodemon

要使用 Nodemon,首先需要安裝它。可以使用 npm 安裝:

npm install --save-dev nodemon

安裝完成後,可以在 package.json 中增加一個新的指令碼:

"scripts": {
  "start:dev": "nodemon src/index.js"
}

這個指令碼會使用 Nodemon 來啟動微服務。當程式碼發生變化時,Nodemon 會自動重新啟動微服務。

Nodemon 的優點

使用 Nodemon 有幾個優點:

  • 自動重新啟動:Nodemon 可以自動偵測程式碼的變化並重新啟動微服務,節省了手動重新啟動的時間。
  • 提高開發效率:Nodemon 可以幫助開發人員更快速地看到程式碼變化的效果,提高開發效率。
  • 減少錯誤:Nodemon 可以幫助開發人員減少錯誤,因為它可以自動重新啟動微服務,避免了手動重新啟動的錯誤。

結合 npx 使用

Nodemon 也可以與 npx 結合使用。npx 是 Node.js 中的一個命令,允許開發人員直接從命令列執行本地安裝的套件。可以使用以下命令來執行 Nodemon:

npx nodemon src/index.js

這個命令會使用 npx 來執行 Nodemon,並啟動微服務。

停止 Nodemon

停止 Nodemon 的方法與停止 Node.js 一樣,只需按下 Ctrl+C 即可停止微服務。

實際應用

以下是 package.json 中的實際應用範例:

{
  "name": "example-3",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.js",
  "scripts": {
    "start": "node src/index.js",
    "start:dev": "nodemon src/index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^5.0.0-beta.1"
  },
  "devDependencies": {
    "nodemon": "^2.0.20"
  }
}

在這個範例中,start:dev 指令碼使用 Nodemon 來啟動微服務,而 start 指令碼使用 Node.js 來啟動微服務。

圖表翻譯:

  graph LR
    A[Nodemon] -->|偵測程式碼變化|> B[重新啟動微服務]
    B -->|提高開發效率|> C[減少錯誤]
    C -->|自動重新啟動|> A

這個圖表展示了 Nodemon 的工作流程,包括偵測程式碼變化、重新啟動微服務、提高開發效率和減少錯誤。

Node.js 專案設定與執行

在 Node.js 中,設定專案並執行它是非常重要的步驟。以下是設定 Node.js 專案和執行它的步驟。

設定專案

首先,需要建立一個新的 Node.js 專案。可以使用 npm init -y 命令來建立一個預設的 Node.js 專案。這個命令會建立一個 package.json 檔案,該檔案包含了專案的相關資訊和依賴項。

{
  "name": "my-project",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "start:dev": "nodemon index.js"
  },
  "dependencies": {
    "express": "^4.17.1"
  },
  "devDependencies": {
    "nodemon": "^2.0.18"
  }
}

執行專案

執行 Node.js 專案可以使用 npm start 命令。這個命令會啟動專案的生產模式。如果需要啟動開發模式,可以使用 npm run start:dev 命令。

npm start
npm run start:dev

安裝依賴項

安裝依賴項可以使用 npm install 命令。如果需要安裝特定的依賴項,可以使用 npm install --save <package-name> 命令。

npm install
npm install --save express

執行指令碼

執行指令碼可以使用 node <script-file> 命令。例如,執行 index.js 指令碼可以使用以下命令:

node index.js

Node.js 命令回顧

以下是 Node.js 中的一些常用命令:

命令描述
node --version檢查 Node.js 的版本號
npm init -y建立一個預設的 Node.js 專案
npm install --save <package-name>安裝一個 npm 包
npm install安裝所有依賴項
node <script-file>執行一個 Node.js 指令碼

內容解密:

以上內容介紹了 Node.js 專案的設定和執行。首先,需要建立一個新的 Node.js 專案,然後設定 package.json 檔案。接下來,可以安裝依賴項和執行專案。最後,回顧了一些常用 Node.js 命令。

圖表翻譯:

  flowchart TD
    A[建立專案] --> B[設定 package.json]
    B --> C[安裝依賴項]
    C --> D[執行專案]
    D --> E[檢查版本號]

這個流程圖展示了建立一個 Node.js 專案的步驟,從建立專案到執行專案。每一步驟都對應著上述內容中的描述。

簡介 Docker 的基本概念

Docker 是一種容器化技術,允許開發人員封裝、釋出和執行應用程式於容器中。容器是輕量級的虛擬化環境,提供了一個隔離的空間來執行應用程式。

容器與映像

容器和映像是 Docker 中的兩個基本概念。容器是執行應用程式的例項,而映像是用於建立容器的範本。映像是唯讀的,而容器是可寫的。

使用 Docker 的優點

使用 Docker 有幾個優點:

  • 輕量級虛擬化:Docker 容器比傳統虛擬機器更輕量級,啟動速度更快。
  • 隔離性:Docker 容器提供了一個隔離的環境,確保應用程式之間不會相互幹擾。
  • 可移植性:Docker 容器可以在不同的環境中執行,無需修改組態。

Docker 的工作原理

Docker 的工作原理如下:

  1. 建立映像:開發人員建立一個 Docker 映像,該映像包含了應用程式的程式碼、依賴項和組態檔案。
  2. 啟動容器:開發人員啟動一個 Docker 容器,該容器從映像中建立。
  3. 執行應用程式:容器內執行應用程式,應用程式可以存取容器中的檔案和資源。

從技術架構視角來看,Node.js 搭配 Express.js 建構影片串流服務展現了輕量且高效的特性。文中逐步闡述了從伺服器搭建、路由設定、串流實作到生產環境佈署的完整流程,涵蓋了開發過程中必要的技術環節。然而,單純的檔案讀取串流方式在高併發情境下可能遭遇效能瓶頸,需進一步考量更健全的串流方案,例如整合專業的串流伺服器或採用雲端服務。此外,文章著重於基礎功能的建置,對於安全性考量,例如許可權控管和資料加密,則未有深入探討,這也是未來實務應用中需要關注的重點。展望未來,隨著 WebRTC 等技術的普及,更低延遲、更高互動性的串流體驗將成為主流,Node.js 生態也將持續發展,提供更豐富的串流解決方案。對於追求高效能且易於維護的串流服務開發者而言,持續關注 Node.js 生態的動態並學習相關最佳實務將至關重要。