原生 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");

});
相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
虎头金猫1 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄1 天前
JavaScript 隐式全局变量解析
javascript
AI职业加油站1 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏1 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s