首页 > 开发 > JS > 正文

Node做中转服务器转发接口

2024-05-06 16:40:24
字体:
来源:转载
供稿:网友

由于项目在做前后端分离,牵扯跨域和夸协议问题,临时抱佛脚,选择用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;/** * 上传文件 * @param files   经过formidable处理过的文件 * @param req    httpRequest对象 * @param postData  额外提交的数据 */function uploadFile(files, req, postData) {  var boundaryKey = Math.random().toString(16);  var endData = '/r/n----' + boundaryKey + '--';  var filesLength = 0, content;  // 初始数据,把post过来的数据都携带上去  content = (function (obj) {    var rslt = [];    Object.keys(obj).forEach(function (key) {      arr = ['/r/n----' + boundaryKey + '/r/n'];      arr.push('Content-Disposition: form-data; name="' + obj[key][0] + '"/r/n/r/n');      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 += '/r/n----' + boundaryKey + '/r/n' +      'Content-Type: application/octet-stream/r/n' +      'Content-Disposition: form-data; name="' + files[key][0] + '"; ' +      'filename="' + files[key][1].name + '"; /r/n' +      'Content-Transfer-Encoding: binary/r/n/r/n';    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做中转服务器转发接口,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对VeVb武林网网站的支持!


注:相关教程知识阅读请移步到JavaScript/Ajax教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表