当前位置: 首页 > article >正文

原生 Node 开发 Web 服务器

一、创建基本的 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) => {

  // 解析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 等文件。

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

});


http://www.kler.cn/a/522983.html

相关文章:

  • 基于Langchain-Chatchat + ChatGLM 本地部署知识库
  • 【学习笔记】计算机网络(二)
  • IO进程寒假作业DAY6
  • 周末总结(2024/01/25)
  • 基于PyQt设计的智能停车管理系统
  • Leetcode 3434. Maximum Frequency After Subarray Operation
  • 一个基于Python+Appium的手机自动化项目~~
  • 【面试】【前端】【性能优化】前端性能优化总结
  • 用XAMPP安装PHP环境(Window系统)
  • [c语言日寄]越界访问:意外的死循环
  • 网络仿真工具Core环境搭建
  • 2025年AI手机集中上市,三星Galaxy S25系列上市
  • P6120 [USACO17JAN] Hoof, Paper, Scissor S
  • 重构字符串(767)
  • 【stm32学习】STM32F103相关特性
  • 抖音上线打车服务?抖音要大规模杀入网约车了吗?
  • Redis存储③Redis基本命令+内部编号和架构
  • SpringCloud系列教程:微服务的未来(十八)雪崩问题、服务保护方案、Sentinel快速入门
  • 接口技术-第3次作业
  • 供应链系统设计-供应链中台系统设计(九)- 商品中心设计篇
  • DBO优化最近邻分类预测matlab
  • c语言初级的复习
  • 2025牛客寒假算法营3
  • leetcode刷题-贪心03
  • 磁盘调度算法
  • 【PySide6快速入门】 QRadioButton单选按钮