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