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);
} */