>  기사  >  웹 프론트엔드  >  노드는 전송 서버 역할을 하며 인터페이스를 전달합니다 - Shi Haibin

노드는 전송 서버 역할을 하며 인터페이스를 전달합니다 - Shi Haibin

一个新手
一个新手원래의
2017-10-19 09:46:051893검색

인터넷에서 다양한 정보를 조회하고 친구의 불완전한 인터페이스를 정리하세요. 완료되면 포워딩 서비스를 이용하실 수 있습니다!

프로젝트가 프론트엔드와 백엔드를 분리하고 있기 때문에 크로스 도메인 및 프로토콜 문제가 있어서 어쩔 수 없이 nodejs를 트랜스퍼로 사용하는 분들이 많을 것 같아요. 하지만 일반양식 전달에는 문제가 없습니다. 첨부파일 업로드 및 전달시 온갖 고민이 해결되었습니다!

1. 이 프로젝트는 매우 특별합니다. 백그라운드에 두 개의 플랫폼이 있는데, 하나는 Java이고 다른 하나는 도넷입니다. 구체적인 이유는 설명하지 않겠습니다.

2. 노드 전달을 할 때 처음에는 파일 전달 작업이 없으므로 사용자가 전달되는 내용을 가로채서 전달할 수 있으며 모든 것이 정상입니다!

3. 파일 전달이 매우 번거롭습니다. 내 생각은 사용자가 업로드한 파일을 노드 서버에 저장하는 것입니다. 강력한 을 사용하십시오.

npm을 통해 설치:


npm install formidable@latest

이를 사용하여 파일을 전송하고 임시 디렉터리에 저장하여 파일 정보를 얻습니다.

파일 패키지를 통해 재구성해보세요. 업로드합니다. 여기서 업로드는 반드시 w3c 파일 업로드 양식 표준을 따라야 하므로, 내용을 직접 확인하시기 바랍니다.

사실 아이디어는 매우 간단하지만 실제 작업은 여전히 ​​꽤 번거롭습니다. 또한 그 과정에서 많은 함정을 겪었습니다. 결국 제 노드는 전송에만 사용되기 때문입니다.

코드로 직접 이동해 보겠습니다. 코드는 여전히 명확합니다.

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";  //项目启动端口

위 내용은 노드는 전송 서버 역할을 하며 인터페이스를 전달합니다 - Shi Haibin의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.