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}`);
});
內容解密:
- 載入必要模組:我們載入
express
和fs
模組。express
用於建立 HTTP 伺服器,而fs
則提供檔案系統 API。 - 設定路由:定義一個 GET 路由
/video
,用於處理影片串流。注意使用async
關鍵字標記此路由為非同步。 - 指定影片路徑:定義影片檔案的路徑。在這個例子中,影片位於
videos
子目錄下。 - 取得影片大小:使用
fs.statSync
方法取得影片檔案的大小,然後編碼到 HTTP 回應頭中。 - 設定 HTTP 回應頭:設定
Content-Type
為video/mp4
以指示瀏覽器這是一個影片檔案,並設定Content-Length
以指定影片大小。 - 串流影片:使用
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伺服器並存取視訊串流。以下是測試步驟:
- 啟動HTTP伺服器:
node src/index.js
- 存取視訊串流:
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 的工作原理如下:
- 建立映像:開發人員建立一個 Docker 映像,該映像包含了應用程式的程式碼、依賴項和組態檔案。
- 啟動容器:開發人員啟動一個 Docker 容器,該容器從映像中建立。
- 執行應用程式:容器內執行應用程式,應用程式可以存取容器中的檔案和資源。
從技術架構視角來看,Node.js 搭配 Express.js 建構影片串流服務展現了輕量且高效的特性。文中逐步闡述了從伺服器搭建、路由設定、串流實作到生產環境佈署的完整流程,涵蓋了開發過程中必要的技術環節。然而,單純的檔案讀取串流方式在高併發情境下可能遭遇效能瓶頸,需進一步考量更健全的串流方案,例如整合專業的串流伺服器或採用雲端服務。此外,文章著重於基礎功能的建置,對於安全性考量,例如許可權控管和資料加密,則未有深入探討,這也是未來實務應用中需要關注的重點。展望未來,隨著 WebRTC 等技術的普及,更低延遲、更高互動性的串流體驗將成為主流,Node.js 生態也將持續發展,提供更豐富的串流解決方案。對於追求高效能且易於維護的串流服務開發者而言,持續關注 Node.js 生態的動態並學習相關最佳實務將至關重要。