3.Node创建一个 HTTP 服务器

书诚小驿2024/10/12前端知识库NodeJS

一、Node 核心模块 http

  1. 创建 HTTP 服务器

了解如何利用 Node.js 的内置模块搭建一个基本的服务器框架,掌握服务器初始化的基本流程。

  1. 服务器接受请求并处理

探讨服务器如何接收客户端的请求,解析请求信息,并根据不同的请求路径执行相应的处理逻辑。

  1. 相应处理结果并断开链接

学习如何将处理结果返回给客户端,包括设置适当的响应头、发送数据,以及正确关闭连接,确保资源的高效利用。

node 学习 http 的 api 文档open in new window

二、创建 HTTP 服务器

1、使用 Node 创建 HTTP 服务器

  1. 创建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();
});
  1. 打开终端,运行node server js命令
node server js

image.png

  1. npm i -g nodemon

运行 npm i -g nodemon 命令后,可以在终端中使用 nodemon 命令来启动 Node.js 应用,享受实时监控和自动重启的便利。

npm i -g nodemon
  1. 通过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();
});

三、服务器数据响应类型处理

  1. 新建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>
  1. 处理其他路径请求(例如图片请求)
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);
    });
  }
});
  1. 执行nodemon server js命令
nodemon server js

image.png

四、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 消息数据

  1. 修改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>
  1. 接受并处理 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();
  }
});
  1. 执行nodemon server js命令
nodemon server js
  1. 打开服务器,输入表单提交

image.png

4、服务器代码模块化拆分

  1. 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>
  1. 新建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();
  }
};
  1. 新建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);
  },
};
  1. server.js文件引用routercontroller
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);
});
最后更新时间' 2025/1/3 14:16:58