• mark一篇文章--用nodejs搭建一个本地反向代理环境


    调试线上代码的时候,我们经常遇到的一个问题就是 本地一套环境,线上一套环境,本地没有的文件用线上的这种需求。我简单来说下使用nodejs如何做到。

    先说下不用nodejs我们怎么做,工具比如fiddler,代理服务器比如nproxy之类都可以完成。但是很麻烦啊,要配置规则还要安装工具,改代理端口之类的,好麻烦,或者用apache或者nginx编写复杂的rewrite规则,apache下还要写抓反向代理的脚本等等。。好麻烦。

    所以今天分享一下我在项目中是如何解决的。

    首先,你本地需要有一个server。

    我选择node-static这个包,很快速的就完成了一个本地server的配置,看代码或者官方文档吧。

    var nodeStatic = require('node-static').Server;
    var request = require("request");
    var dns = require("dns");
    var fileServer = new nodeStatic("./");
    var http = require("http");
    
    var httpServer = http.createServer(function(req, res) {
          req.addListener('end', function() {
            fileServer.serve(req, res, function(err, result) {
                if (err && (err.status === 404)) {
                //本地没有文件访问线上,透明server
                dns.resolve4(req.headers.host,function(err,addresses){
                    if(err){
                        res.writeHeader(200,'text/html');   
                        res.write(req.url);
                        res.end(err);
                     }else{
                        var ip = addresses[0];
                        var p = 'http://'+ip+req.url;
                        req.headers['Host'] = req.headers.host;
                        request({
                            method:req.method,
                            url:p,
                            headers:req.headers
                        }).pipe(res);
                      } 
                });
                }
            });
        }).resume();
    });
    
    httpServer.listen(1314);
    

    简单解释一下上面的代码吧,是从我一个项目里摘出来的。

    首先node-static和http建立了一个本地的http server,然后在当文件本地不存在时,使用dns模块和request模块,来进行反向代理线上资源。

    dns模块可以根据host查找到线上地址的ip,然后使用request直接访问ip,伪造headers,来请求真实资源,资源拿到之后pipe到res中返回即可。

    其实nginx和apache也是这么干的~拿nodejs做起来就是这么简单。

  • 相关阅读:
    鸡啄米vc++2010系列19(常用控件:静态文本框)
    鸡啄米vc++2010系列18(颜色对话框)
    鸡啄米vc++2010系列17(字体对话框)
    鸡啄米vc++2010系列16(文件对话框)
    鸡啄米vc++2010系列15(消息对话框)
    鸡啄米vc++2010系列14(一般属性页对话框的创建)
    鸡啄米vc++2010系类13(向导对话框的创建)
    鸡啄米vc++2010系列12(属性页对话框)
    鸡啄米vc++2010系列11(非模态对话框的创建)
    鸡啄米vc++2010系列10(模态对话框及其弹出过程)
  • 原文地址:https://www.cnblogs.com/dunken/p/4362700.html
Copyright © 2020-2023  润新知