HTTP

62 阅读4分钟

基本用法

const http = require('node:http')
const url = require('node:url')

// req前端发送的请求信息 res给前端响应的信息
http.createServer((req, res) => {
    const { pathname, query } = url.parse(req.url, true)
    if (req.method === 'GET') { 
        if (pathname === '/get') {
            console.log(query)
            res.end('GET')
        } else { 
            res.statusCode = 404
            res.end('404')
        }
    } else if (req.method === 'POST') { 
        // console.log(res)
        if (pathname === '/login') {
            let data = ''
            req.on('data', (chunk) => { 
                console.log(chunk)
                data+=chunk
            })
            req.on('end', () => { 
                res.statusCode = 200
                res.setHeader('Content-Type', 'application/json')
                res.end(data)
            })
        } else { 
            res.statusCode = 404
            res.end('POST')
        }
        // res.end('POST')
    }
}).listen(3000, ()=> { 
    console.log('server is running')
})

正向代理

正向代理就是代理服务器替代访问方【用户A】去访问目标服务器【服务器B】
1.访问本无法访问的服务器B
假设最初用户A要访问服务器B需要经过R1R2路由器这样一个路由节点,
如果路由器R1或者路由器R2发生故障,那么就无法访问服务器B了。
但是如果用户A让代理服务器Z去代替自己访问服务器B,由于代理服务器Z没有在
路由器R1R2节点中,而是通过其它的路由节点访问服务器B,
那么用户A就可以得到服务器B的数据了
2.加速访问服务器B
假设用户A到服务器B,经过R1路由器和R2路由器,而R1R2路由器的链路
是一个低带宽链路。而用户A到代理服务器Z,从代理服务器Z到服务器B都是高带宽链路。
那么很显然就可以加速访问服务器B了
3.Cache作用
如果在用户A访问服务器B某数据J之前,已经有人通过代理服务器Z访问过服务器B
上得数据J,那么代理服务器Z会把数据J保存一段时间,如果有人正好取该数据J,
那么代理服务器Z不再访问服务器B,而把缓存的数据J直接发给用户A
4.防火墙作用
5.隐藏访问者的行踪
代理服务器Z代替用户A去直接与服务器B进行交互,服务器b看不出真实的访问用户

反向代理

反向代理:它充当服务器和客户端之间的中介,将客户端的请求转发到一个或多个后端服务器,
并且将后端服务器的响应返回给客户端
1.负载均衡:反向代理根据预先定义的算法将请求分发到多个后端服务,以实现负载均衡。避免某个后端服务器过载,
提高整体性能和可用性
2.高可用性:通过反向代理,将请求转发到多个后端服务器,以提高冗余和故障转移,如果一个后端服务器出现故障,
代理服务器可将请求转发到其他服务器,实现高可用性
3.缓存和性能优化:反向代理可以缓存静态资源或经常访问的动态内容,还可以通过压缩,合并和性能优化等技术来
优化网络性能
4.安全性:反向代理可以作为防火墙,保护后端服务免受恶意攻击,可以过滤恶意请求,检测和阻止攻击,提供安全认证和访问控制
5.域名和路径重写:反向代理可以根据特定规则重写请求路径和域名,实现url和路由重定向。

npm install http-proxy-middleware
// index.js
const http = require('node:http');
const url = require('node:url');
const fs = require('node:fs');
const { createProxyMiddleware } = require('http-proxy-middleware');
const html = fs.readFileSync('./index.html');
const config = require('./xm.config.js');

http.createServer((req, res) => {
    const { pathname } = url.parse(req.url);
    const proxyList = Object.keys(config.server.proxy)
    if(proxyList.includes(pathname)){
        const proxy = createProxyMiddleware(config.server.proxy[pathname])
        proxy(req, res)
        return
    }
    res.writeHead(200, {
        'Content-Type': 'text/html'
    });
    res.end(html);
}).listen(80, () => {
    
})

// test.js
const http = require('node:http');
const url = require('node:url');
http.createServer((req, res) => {
    const { pathname } = url.parse(req.url);
    if (pathname === '/api') {
        res.end('proxy success')
    }
}).listen(3000, () => {
    console.log('server is running on port 3000');
})

// xm.config.js
module.exports = {
  server: {
        proxy: {
            '/api': {
                target: 'http://localhost:3000',
                changeOrigin: true,
            }
        }
  }
}

//index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>123</div>
    <script>
        fetch('/api').then(res=> res.text()) // 这里发请求进行代理
    </script>
</body>
</html>

动静分离

动静分离是一种在Web服务器架构中常用的优化技术,旨在提高网站的性能和可伸缩性
将动态生成的内容(如动态网页、API请求)与静态资源(如HTML、CSS、JavaScript、图像文件)分开处理和分发

import http from 'node:http'
import fs from 'node:fs'
import path from 'node:path'
import mime from 'mime'

const server = http.createServer((req, res) => {
    const { method, url } = req
    console.log(method, url)
    if(method === 'GET' && url.startsWith('/asset')){
        const staticPath = path.join(process.cwd(), url)
        console.log(staticPath)
        fs.readFile(staticPath, (err, data) => {
            if (err){
                res.writeHead(404, {
                    'Content-Type': 'text/plain'
                })
                res.end('404 Not Found')
                return
            } else {
                const type = mime.getType(staticPath)
                console.log('来了老弟')
                res.writeHead(200, {
                    'Content-Type': type,
                    'Cache-Control': 'public, max-age=3600' // 缓存
                })
                res.end(data)
            }
        })
    }
    // 动态资源
    if(method === 'GET' && url.startsWith('/api')){
        res.writeHead(200, {
            'Content-Type': 'application/json'
        })
        res.end(JSON.stringify({
            code: 200,
            msg: 'success',
            data: {
                name: 'xm',
                age: 18
            }
        }))
    }
})

server.listen(80, () => {
    console.log('server is running')
})

邮件服务

// npm install js-yaml
// npm install nodemailer
import http from 'node:http'
import fs from 'node:fs'
import url from 'node:url'
import yaml from 'js-yaml'
import nodemailer from 'nodemailer'
const mailInfo = yaml.load(fs.readFileSync('./mail.yaml', 'utf8'))
console.log(mailInfo)

const transporter = nodemailer.createTransport({
    service: 'qq',
    host: 'smtp.qq.com',
    port: 587,
    secure: true,
    auth: {
        user: mailInfo.user,
        pass: mailInfo.pass
    }
})

http.createServer((req, res) => {
    const { pathname } = url.parse(req.url)
    const { method } = req
    if (method === 'POST' && pathname === '/send/mail') {
        let data = ''
        req.on('data', (chunk) => {
            data += chunk
        })
        req.on('end', () => {
            const { to, subject, text } = JSON.parse(data)
            transporter.sendMail({
                to,
                from: mailInfo.user,
                subject,
                text
            })
            res.end('success send mail')
        })
        // transporter.sendMail({
        //     to: "发件人",
        //     from: "收件人",
        //     subject: "标题",
        //     text: "内容",
        // })
    }
}).listen(3000, () => {
    console.log('server is running')
})