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

});
相关推荐
Marshmallowc1 分钟前
React stopPropagation 阻止冒泡失效?深度解析 React 17 事件委派机制变更与微前端冲突解决方案
前端·react.js·事件循环·微前端·前端架构
xiaobangsky2 分钟前
使用Nginx配置本地静态资源iscweb访问后端服务fs-isc
运维·nginx
SMF19192 分钟前
【Vmware】windows物理机共享文件给vm虚拟机中的Centos系统
linux·运维·centos
本妖精不是妖精3 分钟前
CentOS 7 安装 Node.js v18.x 完整教程
linux·centos·node.js
txinyu的博客3 分钟前
静态库 & 动态库
linux·运维·服务器
阮松云3 分钟前
Centos挂载分区扩容记录
linux·运维·centos
shhpeng4 分钟前
Debian 包的制作与安装完整指南
运维·debian
xiaohutushen4 分钟前
紧急预警:微软 Edge Webview2 v144 升级导致 SAP GUI 严重白屏故障 (Note 3704912)
前端·microsoft·edge·abap·sap 用户·sap license·usmm
2501_944526424 分钟前
Flutter for OpenHarmony 万能游戏库App实战 - 多语言国际化实现
android·java·开发语言·javascript·flutter·游戏
CHU7290356 分钟前
淘宝扭蛋机小程序前端功能详解:以交互设计赋能趣味体验
java·前端·小程序·php