用 nodejs 做反向代理服务器

背景

有的时候在本地开发,大部分JSON数据基本上可以先伪造,但是有一部分URL请求需要用到线上数据,这个时候就可以利用node.js自己去做一个代理,将需要线上数据的URL请求捕获并转发到线上,下面就直接上代码

PS:如果需要更强大的反向代理可以尝试nginx,怎么配置可以参考:Nginx配置文件nginx.conf中文详解

核心代码

app.js

var path = require('path');
var express = require('express');
var app = express();

app.use(express.static(path.join(__dirname, 'public')));//这里我是把静态资源都放这里了
app.get("/api/*", require("./proxy").proxy);

var server = app.listen(80, function () {
  var host = server.address().address;
  var port = server.address().port;

  console.log('Example app listening at http://%s:%s', host, port);
});

proxy.js

var http = require("http");
var querystring = require("querystring");
exports.proxy = function(req, res) {
    // 获取 /api/ 之后的的 URL 路径
    var path = req.path.replace(/^\/?api/, "");
    //console.dir(path);
    // 获取请求参数
    var contents = querystring.stringify(req.query);
    //console.dir(contents);
    var options = {
        // TODO 配置访问参数
        host: 'api.xxx.com',
        path: '/api' + path,
        method: 'GET',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Content-Length': contents.length
        }
    };
    // 作为 http 客户端向服务器端发送请求
    var request = http.request(options, function(response) {
        if (response.statusCode != 200) {
            // TODO 请求失败,返回错误
            res.status(response.statusCode).end();
            return;
        }
        // TODO 把 response 得到的数据通过 res 发送给浏览器
        //response.setEncoding('UTF-8');
        var pageData = "";
        response.on('data', function(chunk) {
            pageData += chunk;
        });

        response.on('end', function(){
            var content = pageData;
            res.end(content);
        });
    });
    // 向服务器发送请求
    request.write(contents);
    //console.dir(request);
    request.end();
};