目录
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 = 200
res.end("home page")
}else {
res.statusCode = 404
res.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 = 200
res.end("login page")
})
}else {
res.statusCode = 404
res.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);
// 识别mine
const 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")
} else
console.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');
})