先放上已经打包好的地址

https://gitee.com/Amengxiaoya/node-proxy.git  切记 proxyConfig.json 设置代理 ip为自己的ipv4地址 (cmd+ipconfig)

再放上源码地址

https://gitee.com/Amengxiaoya/node-re-quest.git  有点小乱,我测试用的(该项目只用到一个proxy.js文件)。

下载后第一步 `cnpm install` 然后node的pkg库的打包命令 `pkg -t node14-win proxy.js`

主要的proxy.js文件源码

//代理
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}
} = JSON.parse(fs.readFileSync(process.cwd()+'/proxyConfig.json','utf-8')); 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('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Credentials', true);
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', '*');
if (req.method == 'OPTIONS') {
// 回复OPTIONS
res.end('');
return
}
/* 正式代理 */
let options = {
method: req.method,
header:req.headers,
encoding:null
};
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) {
res.setHeader('Content-Type', response.headers['content-type']);
res.statusCode = response.statusCode
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,'by#2585266774@qq.com#')
});

简单的html js node 前端直接使用反向代理软件的更多相关文章

  1. node插件http-proxy实现反向代理

    最近自己动手做了一个微信小程序,是直接买的腾讯云的小程序解决方案,怎么说那,用起来还是会遇到不少问题的,不过在交流群里还是会有很多人帮助你的. 闲话少说,因为要再做一个别的服务,就想直接用这台小程序的 ...

  2. 前端通过Nginx反向代理解决跨域问题

    在前面写的一篇文章SpringMVC 跨域,我们探讨了什么是跨域问题以及SpringMVC怎么解决跨域问题,解决方式主要有如下三种方式: JSONP CORS WebSocket 可是这几种方式都是基 ...

  3. 前端使用 Nginx 反向代理彻底解决跨域问题

    引入网址https://blog.csdn.net/larger5/article/details/81286324 1.请求后端数据失败 代码: <!DOCTYPE html> < ...

  4. 搞懂:前端跨域问题JS解决跨域问题VUE代理解决跨域问题原理

    什么是跨域 跨域:一个域下的文档或脚本试图去请求另一个域下的资源 广义的跨域包含一下内容: 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源请求(内部的引用,脚本script,图片img,fr ...

  5. node项目发布+域名及其二级域名配置+nginx反向代理+pm2

    学习node的时候也写了一些demo.但是只是限于本地测试,从来没有发布.今天尝试发布项目. 需要准备的东西 node 项目:为了突出重点,说明主要问题.我只是拿express 写了很简单的demo. ...

  6. 一统江湖的大前端(2)—— Mock.js + Node.js 如何与后端潇洒分手

    <一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...

  7. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

  8. 使用webpack+vue.js构建前端工程化

    参考文章:https://blog.csdn.net/qq_40208605/article/details/80661572 使用webpack+vue.js构建前端工程化本篇主要介绍三块知识点: ...

  9. HTML、CSS、JS在前端开发中都扮演怎样的角色

    前端开发,需要经常接触 HTML.DOM.CSS.JS等,那么HTML.CSS.JS在前端开发中究竟扮演怎样的角色呢?以下是个人的一些观点... HTML:超文本标记语言 (Hyper Text Ma ...

随机推荐

  1. Java 异步 I/O

    Java 中的异步 I/O 简称 AIO, A 即 Asynchronous.AIO 在 JDK1.7 时引入,基于操作系统提供的异步 I/O 通信模型,封装了一些进行异步 I/O 操作的 API. ...

  2. Android 12(S) 图形显示系统 - 应用建立和SurfaceFlinger的沟通桥梁(三)

    1 前言 上一篇文章中我们已经创建了一个Native示例应用,从使用者的角度了解了图形显示系统API的基本使用,从这篇文章开始我们将基于这个示例应用深入图形显示系统API的内部实现逻辑,分析运作流程. ...

  3. gin中multipart/urlencoded绑定

    package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" ) ty ...

  4. python 使用sqlite,ConfigParser实例

    此实例是本人公司真实场景,使用了VNC,ngrok 技术实现内网穿透,本例是对内网穿透的使用: 此例的最终效果是对于处于各地内网终端实现远程桌面监控及操作: 目前世面上也有一些软件实现了内网穿透(向日 ...

  5. FFT通过傅里叶级数图解频域补零时域内插

    在时域频域的信号分析的过程中,一个常见的说法叫:频域数据补零会让时域数据内插. 意思是在频域数据中多补几个零,再做ifft(逆傅里叶变换)后的时域数据,会变得更加"细腻",分辨率会 ...

  6. What Goes Up Must Come Down

    跳转链接 题目描述 给定一个序列, 求出将此序列变换为单调递增.单调递减 或者先增后减 样例1 输入 7 3 1 4 1 5 9 2 输出 3 样例2 输入 9 10 4 6 3 15 9 1 1 1 ...

  7. dotnet 替换 ASP.NET Core 的底层通讯为命名管道的 IPC 库

    这是一个用于本机多进程进行 IPC 通讯的库,此库的顶层 API 是采用 ASP.NET Core 的 MVC 框架,其底层通讯不是传统的走网络的方式,而是通过 dotnetCampus.Ipc 开源 ...

  8. Nodejs基于Express使用html模板

    express默认使用jade模板,可以配置让其支持使用ejs或html模板. 安装ejs 在项目根目录安装ejs. npm install ejs 2.引入ejs var ejs = require ...

  9. Java中线程的状态及其转化

    线程状态转化图: 说明: 线程总共包括以下5种状态. 1.新状态New:该状态也叫新建状态,当线程对象被创建后,线程就进入了新建状态.例如:Thread thread = new Thread();. ...

  10. Shell中的变量替换

    ${str-newStr} 仅当str为null的时候替换 ${str:-newStr} 当str为null或者str为空字符串的时候替换 综上,-号,当str没有内容,则替换, :号只是增加了空字符 ...