背景
有的时候在本地开发,大部分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();
};