最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • nodejs搭建简单易用的本地代理服务器

    正文概述 掘金(陈小抠?)   2021-01-21   469

    node-proxy-server

    引言

    纯前端开发的时候,很多业务场景需要搭建本地服务器,方便页面浏览。 简单列举几个好处,比如

    • 局域网内多终端访问
    • 配合外网映射
    • 解决接口跨域问题

    我常用到的几种本地搭建服务器的方式,比如

    npm的serve package

    • 全局安装,serve ./启动,方便好用。
    • 直接启动的话不支持跨域。

    webpack-dev-server

    • 一般使用在基于wepack的项目,普通H5搭建需要成本。
    • 支持跨域。

    node-proxy-server 链接

    • 适用于普通页面开发,配置简单,node 命令启动。
    • 支持跨域。

    node-proxy-server 原理

    配置

    配置接口地址的拦截,以及代理接口的地址。

    let conifg = {
        '/xxxx1': { // 需要拦截的本地请求路径
            target: 'http://xxxxxxxx.com', // 代理地址
            port: 80, // 端口,默认80,某些地址可能是8080
        },
        '/xxxx2': { 
            target: 'http://xxxxxxxx.com', 
            port: 80,
        }
        // ...other path
    };
    

    中间代理服务器

    主要利用nodejs的 http 和 fs模块,创建一个中间服务器,接受页面请求,再通过中间服务器去请求真实接口,返回数据。

    let http = require('http');
    let fs = require('fs');
    // 创建中间代理层http服务
    let app = http.createServer(function (request, response) {
    	// 主要逻辑:
    	// 1.拦截请求配置的路径 if(hasProxy(url, request, response))
    	// 2.普通请求,直接通过
    });
    

    拦截请求,转发请求

    根据配置中的设定的拦截路径,拦截请求,并且转发到真实地址中。

    // 判断是否存在代理地址
    function hasProxy(url, request, response) {
        for (const key in conifg) { // 如果存在多个拦截路径
            const { target, port } = conifg[key];
            let info = target.split('//');
            let opts = { // 请求参数
                protocol: info[0],
                host: info[1],
                port: port || 80,
                method: request.method,
                path: url,
                json: true,
                headers: {}
            }
            proxy(opts, request, response);
            return true;
        }
        return false;
    }
    
    // 代理转发
    function proxy(opts, request, response) {
        // 请求真实代理接口
        var proxyRequest = http.request(opts, function (proxyResponse) {
            // 代理接口返回数据,写入本地response
            proxyResponse.on('data', function (chunk) {
                response.write(chunk, 'binary');
            });
            // 代理接口结束,通知本地response结束
            proxyResponse.on('end', function () {
                response.end();
            });
            response.writeHead(proxyResponse.statusCode, proxyResponse.headers);
        });
    
        // 本地接口数据传输,通知代理接口请求
        request.on('data', function (chunk) {
            proxyRequest.write(chunk, 'binary');
        });
    
        // 本地请求结束,通知代理接口请求结束
        request.on('end', function () {
            proxyRequest.end();
        });
    }
    

    普通资源请求

    非拦截请求,直接通过。

    // 普通请求和资源加载
    fs.readFile(__dirname + url, function (err, data) {
        if (err) {
            console.log('请求失败', err);
        } else {
            response.end(data);
        }
    });
    

    源码

    完整代码,欢迎自取。


    起源地下载网 » nodejs搭建简单易用的本地代理服务器

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元