码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2020-03-18 09:21:05      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:ddl   target   else   否支持   const   list   let   listen   字符   

手动封装代理

在服务里面封装一个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插件实现代理

标签:ddl   target   else   否支持   const   list   let   listen   字符   

原文地址:https://www.cnblogs.com/ltfxy/p/12515345.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!