3.Node创建一个 HTTP 服务器
一、Node 核心模块 http
- 创建 HTTP 服务器
了解如何利用 Node.js 的内置模块搭建一个基本的服务器框架,掌握服务器初始化的基本流程。
- 服务器接受请求并处理
探讨服务器如何接收客户端的请求,解析请求信息,并根据不同的请求路径执行相应的处理逻辑。
- 相应处理结果并断开链接
学习如何将处理结果返回给客户端,包括设置适当的响应头、发送数据,以及正确关闭连接,确保资源的高效利用。
二、创建 HTTP 服务器
1、使用 Node 创建 HTTP 服务器
- 创建http_server项目,新建server.js文件
// 1、导入http模块
var http = require("http");
// 2、创建服务器
// 获取到服务器的实例对象
var server = http.createServer();
// 使服务器在8080端口上监听请求
server.listen(8080, function () {
  // 服务器启动成功后输出的消息
  console.log("服务器正在运行,访问地址:http://127.0.0.1:8080");
});
// 3、处理请求事件,当有请求到达时触发此事件
// req 请求, res响应
server.on("request", function (req, res) {
  console.log("打印日志,接收到req请求");
  // 向客户端发送响应数据
  res.write("0000");
  // 结束响应,断开连接
  res.end();
});
- 打开终端,运行node server js命令
node server js

- npm i -g nodemon
运行 npm i -g nodemon 命令后,可以在终端中使用 nodemon 命令来启动 Node.js 应用,享受实时监控和自动重启的便利。
npm i -g nodemon
- 通过nodemon server js来代替node server js命令,享受实时监控和自动重启的便利。
nodemon server js
2、 解决字符编码乱码问题
// 1、导入http模块
var http = require("http");
// 2、创建服务器
// 获取到服务器的实例对象
var server = http.createServer();
// 使服务器在8080端口上监听请求
server.listen(8080, function () {
  // 服务器启动成功后输出的消息
  console.log("服务器正在运行,访问地址:http://127.0.0.1:8080");
});
// 3、处理请求事件,当有请求到达时触发此事件
// req 请求, res响应
server.on("request", function (req, res) {
  console.log("打印日志,接收到req请求");
  // 确保客户端以纯文本格式解析响应内容,并正确处理其中的字符编码。这在处理文本内容时非常重要,以避免出现乱码问题。
  res.setHeader("Content-type", "text/plain;charset=utf-8");
  // res.setHeader("Content-type", "text/html;charset=utf-8");
  // 向客户端发送响应数据
  res.write("<h1>欢迎进入首页</h1>");
  // 结束响应,断开连接
  res.end();
});
三、服务器数据响应类型处理
- 新建index.html和引入logo.png图片
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h1>首页</h1>
    <img src="./logo.png" alt="" />
  </body>
</html>
- 处理其他路径请求(例如图片请求)
var http = require("http");
var fs = require("fs");
var server = http.createServer();
server.listen(8080, function () {
  console.log("服务器正在运行,访问地址:http://127.0.0.1:8080");
});
// req 请求, res响应
server.on("request", function (req, res) {
  // 检查请求的 URL 是否为根路径 "/"
  if (req.url == "/") {
    fs.readFile("./index.html", "utf-8", function (err, data) {
      // 将读取到的 HTML 文件内容写入响应
      res.write(data);
      // 结束响应,发送数据给客户端
      res.end();
    });
  } else {
    // 如果请求的不是根路径,则假设请求的是 "logo.png" 图片
    fs.readFile("./logo.png", function (err, data) {
      res.end(data);
    });
  }
});
- 执行nodemon server js命令
nodemon server js

四、Http 的不同请求方法处理
1、处理客服端不同的请求方法
| 方法 | 说明 | 
|---|---|
| GET | 获取服务器资源 | 
| POST | 向服务器提交数据 | 
| PUT | 向服务器写入资源,如果已存在则进行替换 | 
| DELETE | 删除资源 | 
| HEAD | 获取服务器响应首部 | 
| OPTIONS | 询问服务器所支持的请求方法 | 
2、GET 请求
通过url.parse(req.url, true).query.id获取 get 请求的参数
var http = require("http");
var fs = require("fs");
var url = require("url");
var server = http.createServer();
server.listen(8080, function () {
  console.log("服务器正在运行,访问地址:http://127.0.0.1:8080");
});
server.on("request", function (req, res) {
  if (req.method == "GET") {
    // 获取get请求的参数方法
    console.log(url.parse(req.url, true).query.id);
    if (req.url == "/") {
      fs.readFile("./index.html", "utf-8", function (err, data) {
        res.write(data);
        res.end();
      });
    } else {
      fs.readFile("./logo.png", function (err, data) {
        res.end(data);
      });
    }
  } else if (req.method == "POST") {
  }
});
3、接受并处理 POST 消息数据
- 修改index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <form action="./" method="post">
      <input type="text" name="username" /> <br />
      <input type="text" name="age" />
      <input type="submit" value="post提交" />
    </form>
  </body>
</html>
- 接受并处理 POST 消息
var http = require("http");
var fs = require("fs");
var url = require("url");
var server = http.createServer();
server.listen(8080, function () {
  console.log("服务器正在运行,访问地址:http://127.0.0.1:8080");
});
server.on("request", function (req, res) {
  if (req.method == "GET") {
    // 获取get请求的参数方法
    console.log(url.parse(req.url, true).query.id);
    if (req.url == "/") {
      fs.readFile("./index.html", "utf-8", function (err, data) {
        res.write(data);
        res.end();
      });
    } else {
      fs.readFile("./logo.png", function (err, data) {
        res.end(data);
      });
    }
  } else if (req.method == "POST") {
    // console.log("");
    var data = "";
    req.on("data", function (d) {
      data += d;
    });
    req.on("end", function () {
      console.log(require("querystring").parse(data));
    });
    res.end();
  }
});
- 执行nodemon server js命令
nodemon server js
- 打开服务器,输入表单提交

4、服务器代码模块化拆分
- index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <form action="./" method="post">
      <input type="text" name="username" /> <br />
      <input type="text" name="age" />
      <input type="submit" value="post提交" />
    </form>
  </body>
</html>
- 新建router.js用于处理请求路径和请求方法
// 处理请求路径和请求方法的
var fs = require("fs");
var url = require("url");
var controller = require("./controller");
module.exports = (req, res) => {
  if (req.method == "GET") {
    // 获取get请求的参数方法
    if (req.url == "/") {
      controller.index(res);
    } else {
      fs.readFile("./logo.png", function (err, data) {
        res.end(data);
      });
    }
  } else if (req.method == "POST") {
    // console.log("");
    var data = "";
    req.on("data", function (d) {
      data += d;
    });
    req.on("end", function () {
      controller.user(require("querystring").parse(data), res);
    });
    res.end();
  }
};
- 新建controller.js用于处理业务逻辑
// 处理业务逻辑
var fs = require("fs");
module.exports = {
  index(res) {
    fs.readFile("./index.html", "utf-8", function (err, data) {
      res.write(data);
      res.end();
    });
  },
  user(postData, res) {
    console.log(postData);
  },
};
- server.js文件引用- router和- controller
var http = require("http");
var router = require("./router");
var server = http.createServer();
server.listen(8080, function () {
  console.log("服务器正在运行,访问地址:http://127.0.0.1:8080");
});
server.on("request", function (req, res) {
  router(req, res);
});
