我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Node做中转服务器转发接口

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Node做中转服务器转发接口

由于项目在做前后端分离,牵扯跨域和夸协议问题,临时抱佛脚,选择用nodejs做中转,我想应该好多人都用它。但是做普通的表单转发没啥问题,当处理附件上传转发时,各种蛋疼,已解决!

1.项目比较特殊,后台拥有两个平台,一个java一个donet,比较鸡肋,具体什么原因就不解释了。

2.当做node转发时,刚开始没有转发文件的操作,就做的很简单,用户传过来啥就,拦截到,进行转发,一切都很ok!

3.文件转发,就很麻烦。我的思路,将用户上传的文件存到node服务器。使用formidable 。

通过npm安装:


npm install formidable@latest

  使用它进行文件转存,保存到临时目录得到文件信息。

再通过文件包重组。进行上传。注意此处上传必须遵循w3c上传文件表单标准,具体自己查资料。

其实思路很简单,但是实际操作起来还是挺麻烦,我中间也趟了好多坑,也是自己node不成熟,毕竟只是用来做中转!

直接上代码吧:看代码还是清晰:

server.js,用于启动服务并转发。


var http = require("http");
var url = require("url");
var fs = require('fs');
const querystring = require("querystring");
var path = require('path');
var formidable = require('formidable'),
  os = require('os'),
  util = require('util');
var config = require('./config').types; //
var netServerUrlFlag = require('./config').netServerUrlFlag;
var netServerhost = require('./config').netServerhost;
var netServerport = require('./config').netServerport;
var javaServerUrlFlag = require('./config').javaServerUrlFlag;
var javaServerhost = require('./config').javaServerhost;
var javaServerport = require('./config').javaServerport;
var fileServerUrlFlag = require('./config').fileServerUrlFlag;
var webapp = require('./config').webapp;
var PORT = require('./config').webport;

function uploadFile(files, req, postData) {
  var boundaryKey = Math.random().toString(16);
  var endData = 'rn----' + boundaryKey + '--';
  var filesLength = 0, content;
  // 初始数据,把post过来的数据都携带上去
  content = (function (obj) {
    var rslt = [];
    Object.keys(obj).forEach(function (key) {
      arr = ['rn----' + boundaryKey + 'rn'];
      arr.push('Content-Disposition: form-data; name="' + obj[key][0] + '"rnrn');
      arr.push(obj[key][1]);
      rslt.push(arr.join(''));
    });
    return rslt.join('');
  })(postData); 
  // 组装数据
  Object.keys(files).forEach(function (key) {
    if (!files.hasOwnProperty(key)) {
      delete files.key;
      return;
    }
    content += 'rn----' + boundaryKey + 'rn' +
      'Content-Type: application/octet-streamrn' +
      'Content-Disposition: form-data; name="' + files[key][0] + '"; ' +
      'filename="' + files[key][1].name + '"; rn' +
      'Content-Transfer-Encoding: binaryrnrn';
    files[key].contentBinary = new Buffer(content, 'utf-8');;
    filesLength += files[key].contentBinary.length + fs.statSync(files[key][1].path).size;
  });
  req.setHeader('Content-Type', 'multipart/form-data; boundary=--' + boundaryKey);
  req.setHeader('Content-Length', filesLength + Buffer.byteLength(endData));
  // 执行上传
  var allFiles = Object.keys(files);
  var fileNum = allFiles.length;
  var uploadedCount = 0;
  allFiles.forEach(function (key) {
    req.write(files[key].contentBinary);
    console.log("files[key].path:" + files[key][1].path);
    var fileStream = fs.createReadStream(files[key][1].path, { bufferSize: 4 * 1024 });
    fileStream.on('end', function () {
      // 上传成功一个文件之后,把临时文件删了
      fs.unlink(files[key][1].path);
      uploadedCount++;
      if (uploadedCount == fileNum) {
        // 如果已经是最后一个文件,那就正常结束
        req.end(endData);
      }
    });
    fileStream.pipe(req, { end: false });
  });
}
var server = http.createServer(function (request, response) {
  var clientUrl = request.url;
  var url_parts = url.parse(clientUrl); //解析路径
  var pathname = url_parts.pathname;
  var sreq = request;
  var sres = response;
  // .net 转发请求
  if (pathname.match(netServerUrlFlag) != null) {
    var clientUrl2 = clientUrl.replace("/" + netServerUrlFlag, '');
    console.log(".net转发请求......" + clientUrl2);
    var pramsJson = '';
    sreq.on("data", function (data) {
      pramsJson += data;
    }).on("end", function () {
      var contenttype = request.headers['content-type'];
      if (contenttype == undefined || contenttype == null || contenttype == '') {
        var opt = {
          host: netServerhost, //跨域访问的主机ip
          port: netServerport,
          path: clientUrl2,
          method: request.method,
          headers: {
            'Content-Length': Buffer.byteLength(pramsJson)
          }
        }
      } else {
        var opt = {
          host: netServerhost, //跨域访问的主机ip
          port: netServerport,
          path: clientUrl2,
          method: request.method,
          headers: {
            'Content-Type': request.headers['content-type'],
            'Content-Length': Buffer.byteLength(pramsJson)
          }
        }
      }
      console.log('method', opt.method);
      var body = '';
      var req = http.request(opt, function (res) {
        res.on('data', function (data) {
          body += data;
        }).on('end', function () {
          response.write(body);
          response.end();
        });
      }).on('error', function (e) {
        response.end('内部错误,请联系管理员!MSG:' + e);
        console.log("error: " + e.message);
      })
      req.write(pramsJson);
      req.end();
    })
  } else
    // java 转发请求
    if (pathname.match(javaServerUrlFlag) != null) {
      response.setHeader("Content-type", "text/plain;charset=UTF-8");
      var clientUrl2 = clientUrl.replace("/" + javaServerUrlFlag, '');
      console.log(".java转发请求......http://" + javaServerhost + ":" + javaServerport + "" + clientUrl2);
      var prams = '';
      sreq.on("data", function (data) {
        prams += data;
      }).on("end", function () {
        console.log("client pramsJson>>>>>" + prams);
        const postData = prams;
        console.log("client pramsJson>>>>>" + postData);
        var contenttype = request.headers['content-type'];
        if (contenttype == undefined || contenttype == null || contenttype == '') {
          var opt = {
            host: javaServerhost, //跨域访问的主机ip
            port: javaServerport,
            path: "/hrrp" + clientUrl2,
            method: request.method,
            headers: {
              'Content-Length': Buffer.byteLength(postData)
            }
          }
        } else {
          var opt = {
            host: javaServerhost, //跨域访问的主机ip
            port: javaServerport,
            path: "/hrrp" + clientUrl2,
            method: request.method,
            headers: {
              'Content-Type': request.headers['content-type'],
              'Content-Length': Buffer.byteLength(postData)
            }
          }
        }
        var body = '';
        console.log('method', opt.method);
        var req = http.request(opt, function (res) {
          //console.log("response: " + res.statusCode);
          res.on('data', function (data) {
            body += data;
          }).on('end', function () {
            response.write(body);
            response.end();
            //console.log("end:>>>>>>>" + body);
          });
        }).on('error', function (e) {
          response.end('内部错误,请联系管理员!MSG:' + e);
          console.log("error: " + e.message);
        })
        req.write(postData);
        req.end();
      })
    } else if (pathname.match(fileServerUrlFlag) != null) {
      //文件拦截保存到本地
      var form = new formidable.IncomingForm(),
        files = [],
        fields = [];
      form.uploadDir = os.tmpdir();
      form.on('field', function (field, value) {
        console.log(field, value);
        fields.push([field, value]);
      }).on('file', function (field, file) {
        console.log(field, file);
        files.push([field, file]);
      }).on('end', function () {
        //
        var clientUrl2 = clientUrl.replace("/" + fileServerUrlFlag, '');
        var opt = {
          host: netServerhost, //跨域访问的主机ip
          port: netServerport,
          path: clientUrl2,
          method: request.method
        }
        var body = '';
        var req = http.request(opt, function (res) {
          res.on('data', function (data) {
            body += data;
          }).on('end', function () {
            response.write(body);
            response.end();
          });
        }).on('error', function (e) {
          response.end('内部错误,请联系管理员!MSG:' + e);
          console.log("error: " + e.message);
        })
        //文件上传
        uploadFile(files, req, fields);
      });
      form.parse(sreq);
    }
    else {
      var realPath = path.join(webapp, pathname); //这里设置自己的文件名称;
      var ext = path.extname(realPath);
      ext = ext ? ext.slice(1) : 'unknown';
      fs.exists(realPath, function (exists) {
        //console.log("file is exists:"+exists+" file path: " + realPath + "");
        if (!exists) {
          response.writeHead(404, {
            'Content-Type': 'text/plain'
          });
          response.write("This request URL " + pathname + " was not found on this server.");
          response.end();
        } else {
          fs.readFile(realPath, "binary", function (err, file) {
            if (err) {
              response.writeHead(500, {
                'Content-Type': 'text/plain'
              });
              //response.end(err);
              response.end("内部错误,请联系管理员");
            } else {
              var contentType = config[ext] || "text/plain";
              response.writeHead(200, {
                'Content-Type': contentType
              });
              response.write(file, "binary");
              response.end();
            }
          });
        }
      });
    }
});
server.listen(PORT);
console.log("Server runing at port: " + PORT + ".");

config.js,用于配置。


exports.types = {
 "css": "text/css",
 "gif": "image/gif",
 "html": "text/html",
 "htm": "text/html",
 "ico": "image/x-icon",
 "jpeg": "image/jpeg",
 "jpg": "image/jpeg",
 "js": "text/javascript",
 "json": "application/json",
 "pdf": "application/pdf",
 "png": "image/png",
 "svg": "image/svg+xml",
 "swf": "application/x-shockwave-flash",
 "tiff": "image/tiff",
 "txt": "text/plain",
 "wav": "audio/x-wav",
 "wma": "audio/x-ms-wma",
 "wmv": "video/x-ms-wmv",
 "xml": "text/xml"
};
exports.netServerUrlFlag = "NETSERVER";
exports.netServerhost = "";
exports.netServerport = "";
exports.javaServerUrlFlag = "JAVASERVER";
exports.javaServerhost = ""; //转发的地址
exports.javaServerport = "";//转发的端口
exports.fileServerUrlFlag="FileUpload";
exports.webapp = "public";//项目目录
exports.webport = "82"; //项目启动端口

总结

以上所述是小编给大家介绍的Node做中转服务器转发接口,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程网网站的支持!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Node做中转服务器转发接口

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Node做中转服务器转发接口

由于项目在做前后端分离,牵扯跨域和夸协议问题,临时抱佛脚,选择用nodejs做中转,我想应该好多人都用它。但是做普通的表单转发没啥问题,当处理附件上传转发时,各种蛋疼,已解决! 1.项目比较特殊,后台拥有两个平台,一个java一个donet
2022-06-04

云服务器端口转发

云服务器端口转发是指在一个云服务器上部署多个虚拟主机,每个虚拟主机都会分配相应的端口给其上运行的多个虚拟主机,以确保它们之间的通讯畅通无阻。要在一个云服务器上部署多个虚拟主机,通常需要以下步骤:选择一个云主机平台,并安装必要的服务和协议。例如Apache、GoogleCloud、IronPub等。在云主机平台上创建一个云服务器,并将其连接到公共的网关。在这个云服务器上部署多个虚拟主机,每个虚拟主机都有相应的端口。将多个虚拟...
2023-10-27

腾讯云服务器端口转发

腾讯云服务器端口转发指的是服务器通过TCP/IP协议向客户端发送数据。在使用腾讯云服务器时,通常需要通过Web应用程序向服务器请求连接并发送HTTPGET请求,服务器将响应数据转发到指定的端口,从而实现数据的访问。具体实现步骤如下:客户端和腾讯云服务器进行通信,使用HTTP协议向服务器请求连接。在Web服务器上创建一个HTTPGET请求,并将HTTPHeader设置为服务器支持的IP地址和端口号。客户端通过请求的...
2023-10-27

云服务器配置端口转发

云服务器配置端口转发(CASServerEnterpriseAccessPortIntegration)的概念是通过配置一个特定端口的转发能力,来提高服务器负载均衡的效率,从而降低网络拥塞和故障发生的几率。以下是一个简单的CASServerEnterpriseAccessPortIntegration的配置示例,您可以根据您的实际需要进行配置:确认您的云服务器需要支持哪种端口转发:对
2023-10-26

阿里云服务器端口转发

什么是端口转发?在计算机网络中,端口是用于标识不同应用程序或服务的数字。端口转发是一种网络技术,它允许将来自一个端口的数据流量转发到另一个端口。这对于在不同网络设备之间进行通信或将外部请求转发到内部服务器非常有用。如何在阿里云服务器上进行端口转发?在阿里云服务器上进行端口转发非常简单。以下是一些步骤:登录到阿里云控制台
2023-10-27

亚马逊云服务器端口转发

1.什么是端口转发?在计算机网络中,端口是用于标识应用程序的逻辑地址。每个应用程序都会监听一个特定的端口,以便接收来自其他计算机的请求。但是,有时候我们需要将来自外部网络的请求转发到内部网络中的某个特定端口,这就是端口转发。2.为什么需要端口转发?在云服务器中,我们可能需要将来自外部网络的请求转发到内部网络中的某个特定端口,以便访问某个应用程序或服务。例如,我们可能需要将来自公网的HTTP请求转发到内...
2023-10-27

云服务器配置端口转发命令

以下是一个简单的Python包管理脚本,用于管理服务器的默认端口转发:```importosdefgetdefaultport(serverport):ifnotos.enablesocket:serverport='s38'else:serverport='s34'returnserver_portdefsetdefaultport(serverport):ifinstan
2023-10-26

云服务器转发端口怎么设置

要设置云服务器转发端口,可以通过以下步骤进行操作:1. 连接到云服务器:使用SSH或其他远程连接工具登录到云服务器。2. 确认防火墙规则:检查云服务器的防火墙规则,确保所需的转发端口未被阻止。3. 编辑转发规则:编辑云服务器的转发规则配置文
2023-08-08

阿里云服务器端口转发失败

在这种情况下,我们可以通过以下方法来检查服务器端口的安全性:使用网络日志进行排查:网络日志可以提供服务器端口安全性的相关信息,我们可以通过查看网络日志来找出端口异常的位置和类型。使用端口扫描工具进行检测:使用端口扫描工具可以在云服务器上进行端口扫描,我们可以检测出可能存在的端口攻击,并及时处理。使用防火墙进行监控:防火
阿里云服务器端口转发失败
2023-10-28

腾讯云服务器端口转发失败

检查服务器配置确保您的服务器配置正确,包括端口号、IP地址和其他相关设置。您可以在腾讯云服务器上运行的应用程序中找到这些信息。如果服务器配置不正确,那么您可能无法正确地将请求发送到目标应用程序。检查端口号使用应用程序提供的命令或脚本来检查服务器上的端口号。查找任何错误或警告,以确保您的应用程序在正确的端口上运行。检查防
2023-10-27

阿里云服务器端口转发不了

首先,我们需要了解服务器端口堵塞的原因。有些原因可能是由于服务器配置的问题,例如防火墙的设置不当或者负载过重等。但是,其他一些原因也可能导致服务器端口堵塞。例如,服务器的内存使用过多,导致系统变慢,或者服务器的硬盘空间不足等。为了解决服务器端口堵塞的问题,我们需要考虑一些解决方案。首先,我们需要定期更新服务器的配置文件
2023-10-27

云服务器配置端口转发失败

如果您的云服务器配置端口转发失败,您可以尝试以下步骤来解决问题:1.确认您的配置是否正确,例如:是否开启了端口80,80端口的流量限制是否设置为100。2.检查您的服务器是否有权限访问指定的端口。如果是的话,请检查您的服务器是否允许访问您的指定端口。3.如果您可以访问服务器配置的默认端口,可以尝试在服务器的控制台中配置该端口。4.检查您的网络流量是否超过了您的服务器配置的最高流量限制。这
2023-10-26

301跳转服务器如何做

301跳转服务器是一种重定向方式,用于将一个URL永久重定向到另一个URL。在服务器端实现301跳转可以通过配置服务器的重定向规则来实现。具体做法取决于服务器的类型,以下是一些常见的服务器类型的实现方法:Apache服务器:可以通过在.ht
301跳转服务器如何做
2024-05-13

阿里云做中转服务器的公司

阿里巴巴集团旗下的阿里云是中国最大的云服务提供商之一,它提供了一系列的云计算服务,包括中转服务器的部署和管理服务。中转服务器是指在互联网中传输数据的服务器,它们在互联网上起到了重要的中转和处理作用。本文将详细介绍阿里云如何做中转服务器的公司。阿里云在中转服务器的部署和管理方面有着丰富的经验和专业的技术团队。首先,
阿里云做中转服务器的公司
2023-11-20

云服务器端口转发至本地电脑

您可以使用以下步骤来创建一个端口转发至本地电脑的脚本:打开JavaScript编程软件,并在“开发工具”选项卡下的“服务器”中创建一个新的服务器。打开“插件管理器”,并找到“应用程序”下的“Server.js”。使用JavaScript的rewrite方法将其转换为“./input...”格式。在“服务器名”框中输入“local
2023-10-26

亚马逊云服务器端口转发异常

1.问题描述最近在使用亚马逊云服务器时,发现端口转发出现了异常。具体表现为,我在服务器上开启了一个应用程序,监听了一个指定的端口,但是无法从外部访问该端口。我已经确认了防火墙规则和安全组设置,但是问题仍然存在。2.排查过程在排查问题时,我首先检查了应用程序的日志,发现应用程序在启动时没有报错,也没有监听到其他端口。然后我使用telnet命令测试了该端口是否能够被访问,但是测试结果显示连接被拒绝。接着我检查了...
2023-10-27

编程热搜

目录