学习node.js 七 http 模块
目录
http模块
创建http服务器
反向代理
代码实现
邮件服务
案例实现:
动静分离
代码实现
http模块
“http” 模块是 Node.js 中用于创建和处理 HTTP 服务器和客户端的核心模块。它使得构建基于 HTTP 协议的应用程序变得更加简单和灵活。
- 创建 Web 服务器:你可以使用 “http” 模块创建一个 HTTP 服务器,用于提供 Web 应用程序或网站。通过监听特定的端口,服务器可以接收客户端的请求,并生成响应。你可以处理不同的路由、请求方法和参数,实现自定义的业务逻辑。
- 代理服务器:“http” 模块还可以用于创建代理服务器,用于转发客户端的请求到其他服务器。代理服务器可以用于负载均衡、缓存、安全过滤或跨域请求等场景。通过在代理服务器上添加逻辑,你可以对请求和响应进行修改、记录或过滤。
- 文件服务器:“http” 模块可以用于创建一个简单的文件服务器,用于提供静态文件(如 HTML、CSS、JavaScript、图像等)。通过读取文件并将其作为响应发送给客户端,你可以轻松地构建一个基本的文件服务器。
创建http服务器
const http = require('http');const server = http.createServer((req, res) => {})server.listen(3000, () => {console.log('server is running on port 3000');
})
通过req的method方法可以区分请求的类型
if(req.method === 'GET'){}else if(req.method === 'POST'){}
可以引入node的url库,可以帮我们去解析路由和拿到get请求的参数
案例:
const http = require('http');
const url = require("url")const server = http.createServer((req, res) => {let {pathname,query} = url.parse(req.url, true)if(req.method === 'GET'){if(pathname === "/home") {console.log(query)res.statusCode = 200res.end("home page")}else {res.statusCode = 404res.end("404 page not found")}}else if(req.method === 'POST'){if(pathname === "/login") {let data = ""req.on("data", (chunk) => {data += chunk})req.on("end", () => {console.log(data)res.statusCode = 200res.end("login page")})}else {res.statusCode = 404res.end("404 page not found")}}
})server.listen(3000, () => {console.log('server is running on port 3000');
})
效果图:
反向代理
反向代理(Reverse Proxy)是一种网络通信模式,它充当服务器和客户端之间的中介,将客户端的请求转发到一个或多个后端服务器,并将后端服务器的响应返回给客户端。
反向代理的作用:
- 负载均衡:反向代理可以根据预先定义的算法将请求分发到多个后端服务器,以实现负载均衡。这样可以避免某个后端服务器过载,提高整体性能和可用性。
- 高可用性:通过反向代理,可以将请求转发到多个后端服务器,以提供冗余和故障转移。如果一个后端服务器出现故障,代理服务器可以将请求转发到其他可用的服务器,从而实现高可用性。
- 缓存和性能优化:反向代理可以缓存静态资源或经常访问的动态内容,以减轻后端服务器的负载并提高响应速度。它还可以通过压缩、合并和优化资源等技术来优化网络性能。
代码实现
需要的第三方库
npm install http-proxy-middleware
index.js
const url = require('url');
const http = require('http');
const fs = require('fs');
const config = require('./proxy.config.js');
const { createProxyMiddleware } = require('http-proxy-middleware');
const html = fs.readFileSync("./index.html",{encoding: "utf-8",flag: "r"
})
const server = http.createServer((req,res)=>{// 判断是否符合代理条件let {pathname} = url.parse(req.url,true);let proxyPath = Object.keys(config.server.proxy);if(proxyPath.includes(pathname)){createProxyMiddleware(config.server.proxy[pathname])(req,res);return}res.writeHead(200,{'Content-Type':'text/html'});res.end(html);
})server.listen(80)
如果路由包含api那么就进行代理
代理的一些配置
module.exports = {server: {proxy: {"/api": {target: "http://localhost:3000",changeOrigin: true,pathRewrite: {"^/api": ""}}}}
}
邮件服务
在我们工作中邮件服务充当着一个重要的角色
- 任务分配与跟踪:邮件服务可以用于分配任务、指派工作和跟踪项目进展。通过邮件,可以发送任务清单、工作说明和进度更新,确保团队成员了解其责任和任务要求,并监控工作的完成情况。
- 发送验证码,验证登录
- 自动化构建和持续集成:在持续集成和自动化构建过程中,邮件服务可以用于通知团队成员构建状态、单元测试结果和代码覆盖率等信息。如果构建失败或出现警告,系统可以自动发送邮件通知相关人员,以便及时采取相应措施
案例实现:
import nodemailder from 'nodemailer'
import yaml from 'js-yaml'
import fs from 'node:fs'
import http from 'node:http'
import url from 'node:url'
const mailConfig = yaml.load(fs.readFileSync('./mail.yaml', 'utf8'))
const transPort = nodemailder.createTransport({service: "qq",port: 587,host: 'smtp.qq.com',secure: true,auth: {pass: mailConfig.pass,user: mailConfig.user}
})http.createServer((req, res) => {const { pathname } = url.parse(req.url)if (req.method === 'POST' && pathname == '/send/mail') {let mailInfo = ''req.on('data', (chunk) => {mailInfo += chunk.toString()})req.on('end', () => {const body = JSON.parse(mailInfo)transPort.sendMail({to: body.to,from: mailConfig.user,subject: body.subject,text: body.text})res.end('ok')})}
}).listen(3000)
需要qq的授权码,才可以正常发送邮件
QQ邮件服务文档
文档地址(点击我)
动静分离
动静分离是一种在Web服务器架构中常用的优化技术,旨在提高网站的性能和可伸缩性。它基于一个简单的原则:将动态生成的内容(如动态网页、API请求)与静态资源(如HTML、CSS、JavaScript、图像文件)分开处理和分发。
通过将动态内容和静态资源存储在不同的服务器或服务上,并使用不同的处理机制,可以提高网站的处理效率和响应速度。这种分离的好处包括:
性能优化,负载均衡,安全性高
实现动静分离的方法:
- 使用反向代理服务器(如Nginx、Apache)将静态请求和动态请求转发到不同的后端服务器或服务。
- 将静态资源部署到CDN上,通过CDN分发静态资源,减轻源服务器的负载。
- 使用专门的静态文件服务器(如Amazon S3、Google Cloud Storage)存储和提供静态资源,而将动态请求交给应用服务器处理。
代码实现
1. 开启一个server
2. 判断是否为静态资源请求
3. 识别mime返回文件
注意因为mime有很多,详情如下:
- 文本文件:- text/plain:纯文本文件- text/html:HTML 文件- text/css:CSS 样式表文件- text/javascript:JavaScript 文件- application/json:JSON 数据- 图像文件:- image/jpeg:JPEG 图像- image/png:PNG 图像- image/gif:GIF 图像- image/svg+xml:SVG 图像- 音频文件:- audio/mpeg:MPEG 音频- audio/wav:WAV 音频- audio/midi:MIDI 音频- 视频文件:- video/mp4:MP4 视频- video/mpeg:MPEG 视频- video/quicktime:QuickTime 视频- 应用程序文件:- application/pdf:PDF 文件- application/zip:ZIP 压缩文件- application/x-www-form-urlencoded:表单提交数据- multipart/form-data:多部分表单数据
所以我们自己去写,就需要很多的判断,所以就需要一个额外的库
mime 但是这个库只能使用import的方式导入,所以type需要进行设置
import http from "http"
import fs from "fs"
import mime from "mime"
import path from "path"const server = http.createServer((req, res) => {const {url, method} = req;// 判断是否为静态资源请求if(method === "GET" && url.startsWith("/static")) {// 拼接路劲const filePath = path.join(process.cwd(), url);// 识别mineconst mineType = mime.getType(filePath);// 读取文件fs.readFile(filePath, (err, data) => {if(err) {res.writeHead(404, {"Content-Type": "text/html;charset=utf-8"});res.end("404 not found")} elseconsole.log("我又执行了哦!!")// 设置返回文件res.writeHead(200, {"Content-Type": mineType,// 设置缓存控制头"Cache-Control": "max-age=1000"});res.end(data)})}
})server.listen(3000, () => {console.log('server is running on port 3000');
})