学习node.js 七 http 模块

目录

http模块

创建http服务器

反向代理

代码实现

邮件服务

案例实现:

动静分离

代码实现


http模块

"http" 模块是 Node.js 中用于创建和处理 HTTP 服务器和客户端的核心模块。它使得构建基于 HTTP 协议的应用程序变得更加简单和灵活。

  1. 创建 Web 服务器:你可以使用 "http" 模块创建一个 HTTP 服务器,用于提供 Web 应用程序或网站。通过监听特定的端口,服务器可以接收客户端的请求,并生成响应。你可以处理不同的路由、请求方法和参数,实现自定义的业务逻辑。
  2. 代理服务器:"http" 模块还可以用于创建代理服务器,用于转发客户端的请求到其他服务器。代理服务器可以用于负载均衡、缓存、安全过滤或跨域请求等场景。通过在代理服务器上添加逻辑,你可以对请求和响应进行修改、记录或过滤。
  3. 文件服务器:"http" 模块可以用于创建一个简单的文件服务器,用于提供静态文件(如 HTML、CSS、JavaScript、图像等)。通过读取文件并将其作为响应发送给客户端,你可以轻松地构建一个基本的文件服务器。

创建http服务器

javascript 复制代码
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请求的参数

案例:

javascript 复制代码
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)是一种网络通信模式,它充当服务器和客户端之间的中介,将客户端的请求转发到一个或多个后端服务器,并将后端服务器的响应返回给客户端。

反向代理的作用:

  1. 负载均衡:反向代理可以根据预先定义的算法将请求分发到多个后端服务器,以实现负载均衡。这样可以避免某个后端服务器过载,提高整体性能和可用性。
  2. 高可用性:通过反向代理,可以将请求转发到多个后端服务器,以提供冗余和故障转移。如果一个后端服务器出现故障,代理服务器可以将请求转发到其他可用的服务器,从而实现高可用性。
  3. 缓存和性能优化:反向代理可以缓存静态资源或经常访问的动态内容,以减轻后端服务器的负载并提高响应速度。它还可以通过压缩、合并和优化资源等技术来优化网络性能。
代码实现

需要的第三方库

npm install http-proxy-middleware

index.js

javascript 复制代码
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那么就进行代理

代理的一些配置

javascript 复制代码
module.exports =  {
    server: {
        proxy: {
            "/api": {
                target: "http://localhost:3000",
                changeOrigin: true,
                pathRewrite: {
                    "^/api": ""
                }
            }
        }
    }
}

邮件服务

在我们工作中邮件服务充当着一个重要的角色

  1. 任务分配与跟踪:邮件服务可以用于分配任务、指派工作和跟踪项目进展。通过邮件,可以发送任务清单、工作说明和进度更新,确保团队成员了解其责任和任务要求,并监控工作的完成情况。
  2. 发送验证码,验证登录
  3. 自动化构建和持续集成:在持续集成和自动化构建过程中,邮件服务可以用于通知团队成员构建状态、单元测试结果和代码覆盖率等信息。如果构建失败或出现警告,系统可以自动发送邮件通知相关人员,以便及时采取相应措施
案例实现:
javascript 复制代码
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需要进行设置

javascript 复制代码
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');
})
相关推荐
西岸行者13 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意13 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码13 天前
嵌入式学习路线
学习
毛小茛13 天前
计算机系统概论——校验码
学习
babe小鑫13 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms13 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下13 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。13 天前
2026.2.25监控学习
学习
im_AMBER13 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J13 天前
从“Hello World“ 开始 C++
c语言·c++·学习