首 页 行业热点 新车 试驾评测 养车用车 车型库
当前位置:首页Node做中转服务器转发接口

Node做中转服务器转发接口

2020-11-27 来源:好土汽车网
导读 Node做中转服务器转发接口:由于项目在做前后端分离,牵扯跨域和夸协议问题,临时抱佛脚,选择用nodejs做中转,我想应该好多人都用它。但是做普通的表单转发没啥问题,当处理附件上传转发时,各种蛋疼,已解决! 1.项目比较特殊,后台拥有两个平台,一个java一个donet,比较鸡肋,具体什

由于项目在做前后端分离,牵扯跨域和夸协议问题,临时抱佛脚,选择用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做中转服务器转发接口,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

显示全文