一、创建基本的 HTTP 服务器
使用 http 模块创建 Web 服务器
const http = require("http");// 创建服务器const server = http.createServer((req, res) => {// 设置响应头res.writeHead(200, { "Content-Type": "text/plain" });// 发送响应内容res.end("Hello, World!");});// 监听端口server.listen(3000, () => {console.log("Server running:http://127.0.0.1:3000");});
二、处理不同的 HTTP 请求方法
1. 创建 index.html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Demo</title></head><body><h1>你好啊</h1><form action="./" method="post"><input type="text" name="username" /><input type="text" name="age" /><input type="submit" value="提交" /></form></body></html>
2. 编辑 index.js
const http = require("http");const fs = require("fs");const server = http.createServer((req, res) => {if (req.method === "GET") {// 处理GET请求res.writeHead(200, { "Content-Type": "text/html" });fs.readFile("./index.html", "utf8", (err, data) => {if (!err) {res.end(data);}});} else if (req.method === "POST") {// 处理POST请求let data = "";req.on("data", (chunk) => {data += chunk;});req.on("end", () => {res.writeHead(200, { "Content-Type": "text/plain" });res.end(`This is a POST request. Data received: ${data}`);});} else {// 处理其他请求方法res.writeHead(405, { "Content-Type": "text/plain" });res.end("Method Not Allowed");}});// 监听端口server.listen(3000, () => {console.log("Server running:http://127.0.0.1:3000");});
三、路由处理
const http = require("http");const url = require("url");const server = http.createServer((req, res) => {// 解析URLconst parsedUrl = url.parse(req.url, true);const pathname = parsedUrl.pathname;if (pathname === "/") {// 处理根路径请求res.writeHead(200, { "Content-Type": "text/plain" });res.end("This is the home page");} else if (pathname === "/about") {// 处理/about路径请求res.writeHead(200, { "Content-Type": "text/plain" });res.end("This is the about page");} else {// 处理其他路径请求res.writeHead(404, { "Content-Type": "text/plain" });res.end("Page Not Found");}});server.listen(3000, () => {console.log("Server running on port 3000");});
四、静态文件服务
可以使用`fs`模块来实现静态文件的服务,例如返回 HTML、CSS、JavaScript 等文件。
const http = require("http");const fs = require("fs");const path = require("path");const url = require("url");const server = http.createServer((req, res) => {// 解析URLconst parsedUrl = url.parse(req.url, true);const pathname = parsedUrl.pathname;// 处理根路径请求,返回index.html文件if (pathname === "/") {const filePath = path.join(__dirname, "index.html");fs.readFile(filePath, (err, data) => {if (err) {res.writeHead(500, { "Content-Type": "text/plain" });res.end("Internal Server Error");} else {res.writeHead(200, { "Content-Type": "text/html" });res.end(data);}});// 处理其他静态文件请求} else {const filePath = path.join(__dirname, pathname);// fs.stat 判断路径对应的是否为文件fs.stat(filePath, (err, stats) => {if (err) {res.writeHead(404, { "Content-Type": "text/plain" });res.end("Page Not Found");} else if (stats.isFile()) {// 如果是文件,则读取并返回文件内容fs.readFile(filePath, (err, data) => {if (err) {res.writeHead(500, { "Content-Type": "text/plain" });res.end("Internal Server Error");} else {// 根据文件扩展名设置正确的Content-Typeconst extname = path.extname(filePath);let contentType = "text/plain";if (extname === ".html") {contentType = "text/html";} else if (extname === ".css") {contentType = "text/css";} else if (extname === ".js") {contentType = "application/javascript";}res.writeHead(200, { "Content-Type": contentType });res.end(data);}});} else {res.writeHead(404, { "Content-Type": "text/plain" });res.end("Page Not Found");}});}});server.listen(3000, () => {console.log("Server running on port 3000");});