学习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');
})
相关推荐
每次的天空1 小时前
Android-重学kotlin(协程源码第一阶段)新学习总结
开发语言·学习·kotlin
Brookty1 小时前
【操作系统】线程
java·linux·服务器·后端·学习·java-ee·操作系统
数字芯片实验室7 小时前
分享一个可以学习正则表达式的网址:Pythex.org
学习·正则表达式
陈洪奇7 小时前
注册中心学习笔记整理
笔记·学习
光影少年7 小时前
从前端转go开发的学习路线
前端·学习·golang
fen_fen13 小时前
学习笔记(32):matplotlib绘制简单图表-数据分布图
笔记·学习·matplotlib
萝卜青今天也要开心17 小时前
2025年上半年软件设计师考后分享
笔记·学习
amazinging17 小时前
北京-4年功能测试2年空窗-报培训班学测开-第四十七天
python·学习·selenium
吃货界的硬件攻城狮17 小时前
【STM32 学习笔记】SPI通信协议
笔记·stm32·学习
一个天蝎座 白勺 程序猿17 小时前
Python练习(1)Python基础类型操作语法实战:20道实战题解与案例分析(上)
开发语言·python·学习