当前位置: 首页 > news >正文

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

反向代理的作用:

  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);// 识别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');
})

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 回归分析系列19— 多项式回归进阶
  • Kubernetes 中如何对 etcd 进行备份和还原
  • AI 未来两年:史无前例的变革与挑战
  • 《图解设计模式》笔记(四)分开考虑
  • 2024.8.23
  • SolidityFoundry Merkle Airdrop
  • Python TensorFlow进阶篇
  • 安科瑞AEM系列碳排放碳结算计量电表产品介绍
  • 芋道cloud v2.2.0发布,支持模块选配,丢弃简易版
  • Golang | Leetcode Golang题解之第371题两整数之和
  • 栈的实现.
  • 主线Buildroot开发
  • Kafka运行机制(二):消息确认,消息日志的存储和回收,生产者消息分区
  • Postman接口自动化测试:从入门到实践!
  • 物联网(IoT)设备渗透文章二:智能家居中控系统的渗透与利用
  • Angular 2 DI - IoC DI - 1
  • es6--symbol
  • Intervention/image 图片处理扩展包的安装和使用
  • Java 多线程编程之:notify 和 wait 用法
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • 番外篇1:在Windows环境下安装JDK
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 微服务入门【系列视频课程】
  • 消息队列系列二(IOT中消息队列的应用)
  • 学习使用ExpressJS 4.0中的新Router
  • 云大使推广中的常见热门问题
  • 怎样选择前端框架
  • Nginx实现动静分离
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #android不同版本废弃api,新api。
  • #includecmath
  • #php的pecl工具#
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • ( 10 )MySQL中的外键
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (八十八)VFL语言初步 - 实现布局
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (论文阅读40-45)图像描述1
  • (转)Linux下编译安装log4cxx
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .bat批处理出现中文乱码的情况
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET Core 中插件式开发实现
  • .NET DataGridView数据绑定说明
  • .NET Framework杂记
  • .NET下ASPX编程的几个小问题
  • .net下简单快捷的数值高低位切换
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • @angular/cli项目构建--Dynamic.Form
  • @Pointcut 使用
  • [ C++ ] STL_vector -- 迭代器失效问题