在 Node.js 中建立 HTTP 伺服器是一個基本且重要的任務。Node.js 提供了 http 模組,用於構建能夠處理 HTTP 請求和響應的伺服器。在這篇文章中,我們將透過幾個例子來展示如何使用 Node.js 建立 HTTP 伺服器。
示例 1:基本 HTTP 伺服器
下面是一個簡單的 HTTP 伺服器,它監聽 8080 埠,並對所有請求響應 "Hello, World!"。
const http = require('http'); const server = http.createServer((req, res) = >{ res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello, World!\n'); }); server.listen(8080, () = >{ console.log('Server running at http://127.0.0.1:8080/'); });
示例 2:處理不同 HTTP 方法
這個例子演示瞭如何根據不同的 HTTP 方法(GET, POST, etc.)來處理請求。
const http = require('http'); const server = http.createServer((req, res) = >{ if (req.method === 'GET') { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Received a GET request\n'); } else if (req.method === 'POST') { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Received a POST request\n'); } else { res.writeHead(405, { 'Content-Type': 'text/plain' }); res.end(`$ { req.method } is not allowed on the server\n`); } }); server.listen(8080, () = >{ console.log('Server running at http://127.0.0.1:8080/'); });
示例 3:解析請求 URL
在這個例子中,我們將解析請求的 URL 來提供不同的響應。
const http = require("http"); const url = require("url"); const server = http.createServer((req, res) => { const parsedUrl = url.parse(req.url, true); // 預設返回的內容 let content = "Page not found\n"; let statusCode = 404; // 處理不同的路由 if (req.method === "GET") { res.setHeader("Content-Type", "text/html"); // 預先設定內容型別 if (parsedUrl.pathname === "/") { content = "<h1>Home</h1>"; statusCode = 200; } else if (parsedUrl.pathname === "/about") { content = "<h1>About</h1>"; statusCode = 200; } } else if (req.method === "POST" && parsedUrl.pathname === "/submit") { let body = ''; req.on('data', chunk => { body += chunk.toString(); }); req.on('end', () => { res.writeHead(200, { "Content-Type": "text/plain" }); res.end(`Data:${body}\n`); }); return; // 防止後續設定響應頭 } // 如果請求不是POST到/submit,寫入頭部並且結束響應 res.writeHead(statusCode); res.end(content); }); server.listen(8080, () => { console.log("伺服器執行在 http://127.0.0.1:8080/"); });
示例 4:處理查詢字串
此例演示如何處理 URL 中的查詢字串引數。
const http = require('http'); const url = require('url'); const server = http.createServer((req, res) => { const parsedUrl = url.parse(req.url, true); const query = parsedUrl.query; res.writeHead(200, { 'Content-Type': 'text/plain' }); if (query.name) { res.end(`Hello, ${query.name}!\n`); } else { res.end('Hello, Stranger!\n'); } }); server.listen(8080, () => { console.log('Server running at http://127.0.0.1:8080/'); });
http://127.0.0.1:8080/?name=123
示例 5:靜態檔案伺服器
這個例子建立了一個簡單的靜態檔案伺服器,可以用來提供 HTML, CSS 和 JavaScript 檔案。
const http = require('http'); // 引入HTTP模組 const fs = require('fs'); // 引入檔案系統模組 const path = require('path'); // 引入路徑模組 // 建立HTTP伺服器 const server = http.createServer((req, res) => { // 解析請求的檔案路徑,如果請求根路徑,則返回index.html let filePath = path.join(__dirname, 'public', req.url === '/' ? 'index.html' : req.url); // 獲取檔案的副檔名 let extname = path.extname(filePath); // 預設內容型別為text/html let contentType = 'text/html'; // 根據副檔名設定正確的內容型別 switch (extname) { case '.css': contentType = 'text/css'; break; case '.js': contentType = 'text/javascript'; break; case '.json': contentType = 'application/json'; break; case '.png': contentType = 'image/png'; break; case '.jpg': contentType = 'image/jpg'; break; // 可以根據需要新增更多的內容型別 } // 讀取指定的檔案 fs.readFile(filePath, (error, content) => { if (error) { // 如果未找到檔案,返回404頁面 if (error.code === 'ENOENT') { fs.readFile(path.join(__dirname, 'public', '404.html'), (error, content) => { res.writeHead(404, { 'Content-Type': 'text/html' }); res.end(content, 'utf-8'); }); } else { // 處理其他錯誤,如伺服器錯誤 res.writeHead(500); res.end(`抱歉,檢查站點管理員的錯誤:${error.code} ..\n`); } } else { // 成功讀取檔案,返回檔案內容 res.writeHead(200, { 'Content-Type': contentType }); res.end(content, 'utf-8'); } }); }); // 伺服器監聽埠 8080 server.listen(8080, () => { console.log('伺服器執行在 http://127.0.0.1:8080/'); });
建立public資料夾,再目錄下 建立檔案index.html
< !DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h1>hello world</h1> </body> </html>
在以上的例子中,我們建立了一個基本的靜態檔案伺服器,它會根據請求的檔案型別設定正確的 Content-Type 並提供檔案內容。如果請求的檔案不存在,它會返回一個 404 錯誤頁面。
透過這些例子,你應該能夠開始構建自己的 HTTP 伺服器,並根據自己的需求進行擴充套件和定製。