先放上已经打包好的地址

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文件源码

  1. //代理
  2. const querystring = require('querystring');
  3. const util = require('util');
  4. const http = require('http');
  5. const request = require('request');
  6. const formidable = require("formidable");
  7. const path = require("path");
  8. const fs = require("fs");
  9. const FormData = require('form-data')
  10. const {
  11. hostIp,
  12. apiPort,
  13. redirUrl,
  14. customQuery,
  15. consoleConfig:{apiSuc,apiFail,apiMsg,removeFile,removeMsg}
  16. } = JSON.parse(fs.readFileSync(process.cwd()+'/proxyConfig.json','utf-8'));
  17. function saveFiles(req,options,callback){
  18. const promiseCase=[];
  19. var form = new formidable.IncomingForm();
  20. form.keepExtensions = true;
  21. form.multiples = true;
  22. form.uploadDir = path.join(process.cwd());
  23. form.parse(req, function(err, fields, files) {
  24. //const formData = new FormData()
  25. options.formData = {};
  26. for (let key in fields) {
  27. //formData.append(key, fields[key])
  28. options.formData[key]=fields[key]
  29. }
  30. for (let key in files) {
  31. let newFilepath='Tmp-'+files[key].originalFilename;
  32. fs.renameSync(files[key].newFilename,newFilepath)
  33. //formData.append(key, fs.createReadStream('./'+newFilepath))
  34. options.formData[key]=fs.createReadStream('./'+newFilepath,{highWaterMark:9999999})
  35. new Promise((rev)=>{
  36. promiseCase.push(rev)
  37. }).then(()=>{
  38. fs.unlink('./'+newFilepath,function(err){
  39. if(removeFile==="0"){
  40. console.log(err?'清理临时文件异常':'删除临时图片成功');
  41. }
  42. if(removeMsg==="0"&&err){
  43. console.log(err);
  44. }
  45. })
  46. })
  47. }
  48. request(options, function(error, response, body){
  49. callback(error, response, body)
  50. for (let item of promiseCase) {
  51. item()
  52. }
  53. promiseCase.splice(0,)
  54. })
  55. //pipe(fs.createWriteStream(files.file.originalFilename))//formData.pipe()
  56. })
  57. }
  58. //创建代理服务
  59. const httpServer = http.createServer((req, res) => {
  60. res.setHeader('Access-Control-Allow-Origin', '*');
  61. res.setHeader('Access-Control-Allow-Credentials', true);
  62. res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  63. res.setHeader('Access-Control-Allow-Headers', '*');
  64. if (req.method == 'OPTIONS') {
  65. // 回复OPTIONS
  66. res.end('');
  67. return
  68. }
  69. /* 正式代理 */
  70. let options = {
  71. method: req.method,
  72. header:req.headers,
  73. encoding:null
  74. };
  75. if(customQuery!=='-1'){
  76. options.headers={};
  77. for (let key in customQuery) {
  78. options.headers[key]=req.headers[customQuery[key]]
  79. }
  80. }
  81. options.url = redirUrl + req.url
  82. function callback(error, response, body) {
  83. res.setHeader('Content-Type', response.headers['content-type']);
  84. res.statusCode = response.statusCode
  85. if (!error) { //删除 && response.statusCode === 200
  86. if(apiSuc==="0"){
  87. console.log(req.url + '成功代理')
  88. }
  89. res.end(body);
  90. } else {
  91. if(apiFail==="0"){
  92. console.log(req.url + '请求异常')
  93. }
  94. if(apiMsg==="0"){
  95. console.log(error)
  96. }
  97. res.end("{'code':-1,'msg':'node请求异常'}");
  98. }
  99. }
  100. if (options.method === 'GET') {
  101. request(options, callback);
  102. }else if (options.method === 'POST') {
  103. if(/^multipart\/form-data/.test(req.headers['content-type'])){
  104. saveFiles(req,options,callback)
  105. }else{
  106. // 定义了一个post变量,用于暂存请求体的信息
  107. var post = '';
  108. // 通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
  109. req.on('data', function(chunk) {
  110. post += chunk;
  111. });
  112. req.on('end', function() {
  113. options.body=post
  114. request(options, callback);
  115. });
  116. }
  117. }
  118. }).listen(apiPort, hostIp, () => {
  119. console.log('开启代理---' + hostIp + ':' + apiPort + '---为---' + redirUrl,'by#2585266774@qq.com#')
  120. });

简单的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. 使用3D Tiles Overview学习3D Tiles

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 3D Tiles的创建是为了在web上传输大量的3D数据集.作为 ...

  2. 关于启动bash提示‘bash: export: `//这是新的': not a valid identifier’的解决办法

    学习linux以来将centos改的也不少了,也不知道这个问题是由于那个修改来的.最近改bash的操作环境配置文件,用到了~/.bashrc这个文件,发现里面被我修改过. 那是当年安装fcitx输入法 ...

  3. golang中的接口值

    package main import ( "bytes" "fmt" "io" ) // 此处的w参数默认是一个空接口,当传递进来buf参 ...

  4. Tomcat-部署web工程方式

    Tomcat(部署web工程) 第一种方法:只需要把web工程的目录拷贝到Tomcat的webapps目录下即可 1,在webapps目录下创建一个book工程, 2,或者把做的工程内容拷贝到weba ...

  5. 前端基础之CSS(浮动-解决溢出-实现个人头像框)

    目录 一:浮动float 1.什么是浮动? 2.浮动的作用 3.浮动有两个特点 4.float格式 二:代码实现左右浮动边框 三:浮动造成父标签塌陷问题(清除浮动) 1.浮动会造成父标签的影响 三:清 ...

  6. 裸k8s搭建中遇到的两个坑

    在装docker的时候报错了,需要先安装selinux版本.才能安装容器. 需要按照提示安装这个包. 采用强制安装.rpm -ivh 包名字 --force --nodeps 在k8s的master上 ...

  7. Mac iterm2 配色以及终端大小写敏感解决方案

    iterm2是mac下非常好用的一款终端.但默认的配色实在不好用,经过一翻搜索终于找到了比较满意的,以下贴出博主的解决方案 配色 首先修改 ~/.bash_profile 加入一下代码 #enable ...

  8. scanf用法及scanf中有\n的问题

    scanf()函数的原理 想象输入设备(键盘)连接着一个叫"缓冲"的东西,把缓冲认为是一个字符数组. 当你的程序执行到scanf时,会从你的缓冲区读东西,如果缓冲区是空的,就阻塞住 ...

  9. ubuntu vi 使用

    转载请注明来源:https://www.cnblogs.com/hookjc/ 文书编辑器介绍 [VI] vi ( m ) 在大多数的 unix 系统中 ( 包括 linux ) 都内建 vi ( m ...

  10. bash_profile和bashsrc的区别

    感谢大佬:http://unclealan.cn/index.php/system/128.html 描述 在类Linux或者MACOS系统中,家目录(用户目录)中我们会看到,.bash_profil ...