Noodjs 代理的实现:手动封装代理与http-proxy-middleware插件实现代理

Posted  Island

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Noodjs 代理的实现:手动封装代理与http-proxy-middleware插件实现代理相关的知识,希望对你有一定的参考价值。

手动封装代理

在服务里面封装一个http请求,发向被代理的服务器,将被代理服务器返回的数据,发送给客户端,承担一个中间桥梁作用,实现代理。

/* 
    创建一个代理服务器,给发送过来的请求发送响应拉钩的服务器数据
    http://localhost:8099/listmore.json?pageNo=2&pageSize=15
    https://m.lagou.com/listmore.json?pageNo=2&pageSize=15
    req.url拿到端口后面的数据
    https.get向拉钩发送请求,把这个请求的响应数据发送给客户端,完成代理
*/
const http = require('http');
const https = require('https');
const baseUrl = "https://m.lagou.com";
http.createServer((request, response) => {
    let url = baseUrl + request.url;
    https.get(url, res => {
        let err;
        const { statusCode } = res;
        let rawData = "";

        // console.log("res.headers",res.headers["content-type"]);
        if (!statusCode === 200) err = new Error("服务器响应失败");
        if (!/application/json|image/x-icon/.test(res.headers["content-type"])) err = new Error("数据格式不正确");
        if (err) {
            console.log(err);
            res.resume();
            return;
        }

        res.on("data", chunk => {
            rawData += chunk;
        });
        
        res.on("end", () => {
            try {
                //设置编码集
                response.setHeader('content-type','application/json;chartset=utf-8');
                //设置跨域,一般不建议为*,会有安全问题,这里随便设置为百度,百度的一二级域名都能访问
                response.setHeader('access-control-allow-origin','*.baidu.com');
                response.write(rawData);
                response.end();
            } catch (e) {
                console.log(e);
            }
        });
    });
}).listen(8099, () => {
    console.log("server start at 8099");
});

http-proxy-middleware插件实现代理

用的时候需要给proxy传进一个对象参数param,这个对象有三个属性

  • target:baseurl,//是需要代理服务的站点url,
  • changeOrigin:true,//是否支持跨域
  • pathWrite:{regexstr : replacestr //regex是正则字符串,replacestr将正则匹配到的字符串替换为replacestr}
    在httpserver里面将req和res当作形参传给proxy(param)的返回值并return,实现代理
/*
    使用第三方模块 http-proxy-middleware完成代理
    http://localhost:8099/fetch/listmore.json?pageNo=2&pageSize=15
    https://m.lagou.com/listmore.json?pageNo=2&pageSize=15
    
    http-proxy-middleware
        const proxy = require('http-proxy-middleware');
        proxy(obj) 
        只需要一个obj对象,
        obj{
            target:vaseurl,//是需要代理服务的站点url,
            changeOrigin:true,//是否支持跨域
            pathWrite:{ 
                regexstr : replacestr //regex是正则字符串,replacestr将正则匹配到的字符串替换为replacestr
            }
        }
        
*/
const http = require('http');
const proxy = require('http-proxy-middleware');
const baseUrl = "https://m.lagou.com";
http.createServer((req, res) => {
    if (/fetch/.test(req.url)) {
        var param = {
            target: baseUrl,
            changeOrigin: true,
            pathRewrite: {
                '^/fetch': ""
            }
        }
        var proxyDemo = proxy(param);
        return proxyDemo(req, res);
    } else {
        res.end();
    }
}).listen(8099, () => {
    console.log("server start at 8099");
});

以上是关于Noodjs 代理的实现:手动封装代理与http-proxy-middleware插件实现代理的主要内容,如果未能解决你的问题,请参考以下文章

适配器模式装饰模式代理模式异同

Atitit.HTTP 代理原理及实现 正向代理与反向代理attilax总结

设计模式之代理:手动实现动态代理,揭秘原理实现

Squid缓存服务器原理与实战演练

SpringAOP总结

SpringAOP总结