学习node.js 七 http 模块

目录

http模块

创建http服务器

 反向代理

代码实现 

邮件服务

案例实现: 

动静分离 

代码实现 


http模块

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

  1. 创建 Web 服务器:你可以使用 “http” 模块创建一个 HTTP 服务器,用于提供 Web 应用程序或网站。通过监听特定的端口,服务器可以接收客户端的请求,并生成响应。你可以处理不同的路由、请求方法和参数,实现自定义的业务逻辑。
  2. 代理服务器:“http” 模块还可以用于创建代理服务器,用于转发客户端的请求到其他服务器。代理服务器可以用于负载均衡、缓存、安全过滤或跨域请求等场景。通过在代理服务器上添加逻辑,你可以对请求和响应进行修改、记录或过滤。
  3. 文件服务器:“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)是一种网络通信模式,它充当服务器和客户端之间的中介,将客户端的请求转发到一个或多个后端服务器,并将后端服务器的响应返回给客户端。

反向代理的作用:

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

需要的第三方库

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": ""
                }
            }
        }
    }
}

邮件服务

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值