原生 Node 开发 Web 服务器

一、创建基本的 HTTP 服务器

使用 http 模块创建 Web 服务器

javascript 复制代码
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

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

javascript 复制代码
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");

});

三、路由处理

javascript 复制代码
const http = require("http");

const url = require("url");

const server = http.createServer((req, res) => {

  // 解析URL

  const 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 等文件。

javascript 复制代码
const http = require("http");

const fs = require("fs");

const path = require("path");

const url = require("url");

const server = http.createServer((req, res) => {

  // 解析URL

  const 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-Type

            const 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");

});
相关推荐
我科绝伦(Huanhuan Zhou)2 分钟前
Linux rpm包损坏解决方案
运维
2603_965896623 分钟前
JavaScript 对象零基础详解|属性、方法、遍历、增删改查
开发语言·javascript·ecmascript
天道kabuto12 分钟前
踩坑实录:JS Map迭代器为什么“用完即焚”?兼谈技术知识沉淀
前端
字节跳动开源16 分钟前
VisActor全新图可视化开源项目:VGraph
前端·设计模式·开源
打呵欠的猫18 分钟前
前端接口超时从 15s 改到动态值后,用户投诉降了 60%——AI 帮我分析出的方案
前端·ai编程
岁月宁静18 分钟前
二、《从零手撸 Agent》 — 聊聊 LLM 的失忆真相
前端·python·agent
数据库小学妹22 分钟前
MySQL死锁排查:锁机制原理、死锁日志与information_schema定位
运维·数据库·mysql
liulilittle23 分钟前
REALITY 代理隧道的有效检测方法: 被动、主动与确定性三层实证研究
linux·服务器·网络·网络协议·安全·网络安全·通信
郭邯25 分钟前
用纯前端实现一个代码压缩美化工具,我踩了这三个坑
前端
阿黎梨梨26 分钟前
AI也有记忆?LangChain Memory 管理指南
langchain·node.js·llm