(最新)node 反向代理完整代码

2 篇文章 0 订阅
2 篇文章 0 订阅

github地址 https://gitee.com/Amengxiaoya/node-re-quest.git 只看proxy.js 和 proxyConfig.json 配置文件

//代理
const querystring = require('querystring');
const util = require('util');
const http = require('http');
const request = require('request');
const formidable = require("formidable");
const path = require("path");
const fs = require("fs");
const FormData = require('form-data')

const {
	hostIp,
	apiPort,
	redirUrl,
	customQuery,
	consoleConfig:{apiSuc,apiFail,apiMsg,removeFile,removeMsg}
} = require('./proxyConfig.json')

function saveFiles(req,options,callback){
	const promiseCase=[];
	var form = new formidable.IncomingForm();
	form.keepExtensions = true;
	form.multiples = true;
	form.uploadDir = path.join(process.cwd());
	form.parse(req, function(err, fields, files) {
		//const formData = new FormData()
		options.formData = {};
		for (let key in fields) {
			//formData.append(key, fields[key])
			options.formData[key]=fields[key]
		}
		for (let key in files) {
			let newFilepath='Tmp-'+files[key].originalFilename;
			fs.renameSync(files[key].newFilename,newFilepath)
			//formData.append(key, fs.createReadStream('./'+newFilepath))
			options.formData[key]=fs.createReadStream('./'+newFilepath,{highWaterMark:9999999})
			new Promise((rev)=>{
				promiseCase.push(rev)
			}).then(()=>{
				fs.unlink('./'+newFilepath,function(err){
					if(removeFile==="0"){
						console.log(err?'清理临时文件异常':'删除临时图片成功');
					}
					if(removeMsg==="0"&&err){
						console.log(err);
					}
				})
			})
		}
		request(options, function(error, response, body){
			callback(error, response, body)
			for (let item of promiseCase) {
				item()
			}
			promiseCase.splice(0,)
		})
		//pipe(fs.createWriteStream(files.file.originalFilename))//formData.pipe()
	})
}

//创建代理服务
const httpServer = http.createServer((req, res) => {
	res.setHeader('Content-Type', 'text/plain; charset=utf-8');
	res.writeHeader(200, {
		"Access-Control-Allow-Origin": "*",
		'Access-Control-Allow-Credentials': true,
		"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
		"Access-Control-Allow-Headers": "*"
	});
	if (req.method == 'OPTIONS') {
		// 回复OPTIONS
		res.end('');
		return
	}
	/* 正式代理 */
	let options = {
		method: req.method,
		header:req.headers
	};
	if(customQuery!=='-1'){
		options.headers={};
		for (let key in customQuery) {
			options.headers[key]=req.headers[customQuery[key]]
		}
	}
	options.url = redirUrl + req.url
	function callback(error, response, body) {
		if (!error) { //删除 && response.statusCode === 200
			if(apiSuc==="0"){
				console.log(req.url + '成功代理')
			}
			res.end(body);
		} else {
			if(apiFail==="0"){
				console.log(req.url + '请求异常')
			}
			if(apiMsg==="0"){
				console.log(error)
			}
			res.end("{'code':-1,'msg':'node请求异常'}");
		}
	}
	if (options.method === 'GET') {
		request(options, callback);
	}else if (options.method === 'POST') {
		if(/^multipart\/form-data/.test(req.headers['content-type'])){
			saveFiles(req,options,callback)
		}else{
			// 定义了一个post变量,用于暂存请求体的信息
			var post = '';
			// 通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
			req.on('data', function(chunk) {
				post += chunk;
			});
			req.on('end', function() {
				options.body=post
				request(options, callback);
			});
		}
	}
}).listen(apiPort, hostIp, () => {
	console.log('开启代理---' + hostIp + ':' + apiPort + '---为---' + redirUrl)
});
//body = Buffer.concat([body]).toString();
// 在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
//req.on('end', function() {
	/* let requestReq = //util.inspect(post)//post = querystring.parse(post);
	requestReq.write(querystring.stringify({"status_copy":0,"city":1,"type":2,"mmsg":"加载中","request_for_abort":null,"page":1,"pageNum":12,"token":"9GN0JDE7"}))
	requestReq.end() */
	/* req.write(post_data + "\n");
	req.end(); */
	/* post = querystring.parse(post);
	res.end(util.inspect(post)); */
//});
/* if(req.headers['content-type']!==undefined){
	const contentType = req.headers['content-type'];
	res.setHeader('Content-Type', contentType);
} */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值