node 中转服务器 完成代码

var express = require('express');
var router = express.Router();
var url  = require('url')
var http = require('http')
var qs = require('querystring'); 
var config = require('../../config/config');
var request=require('request');
var fs = require("fs");
var multer = require("multer");
var upload = multer({dest:'./public/uploads'});
/**
 *  backstage/v8login 登录
 */
router.post('/backstage/v8login',function( req,res ){  
    httpA.loginPost( req , res );
}) 
/**
 * 上传文件
 */
router.post('/uc/v1/file/upload', upload.single('file'),function( req,res ){
    var file_type;
    if (req.file.mimetype.split('/')[0] == 'image'){
         file_type = '.' + req.file.mimetype.split('/')[1];
    }
    if (file_type) {
        fs.rename(req.file.path, req.file.path + file_type, function (err, doc) {
            if (err) {
                console.error(err);
                return;
            }
            httpA.postFile( req,res ,'./public/uploads/' + req.file.filename + file_type,req.file.filename + file_type );
        })
        return;
    } else{
        res.json({ code:"1",message:"上传失败" })
    }   
})
router.get('*',function( req,res ){
    httpA.get( req , res );
})

router.post('*',function( req,res ){
    httpA.post( req , res );
})  
  

module.exports = router;

var httpA = {
    loginPost( req , res ){
        var content  = qs.stringify( req.body ) ;
        var options = {  
            hostname: config.adminHost,  
            port: config.adminPort,  
            path: req._parsedUrl.path,  
            method: 'POST',  
            headers: {  
                'Content-Type': req.headers['content-type'],
                "Content-Length":content.length, 
            }  
        };
        var httpObj = http.request(options, function (  response ) {  
            if( response.statusCode != 200 ){
                res.json({ code: response.statusCode,message:response.statusMessage }); 
            }
            response.setEncoding('utf8');  
            response.on('data', function (chunk) {  
                let data = JSON.parse( chunk ); // 将token存储到服务端
                if( data.code == 0){
                    localStorage.setItem( 'user'+data.data.sysUseId,data.data.token );
                    data.data.token = data.data.sysUseId;
                }
                res.json( data )
            });  

        });  
        httpObj.on('error', function (e) {   // 错误信息
            res.json( { error: e } )
        });
        httpObj.write(content);
        httpObj.end();
    },
    get( req , res ){
        http.get( 'http://'+config.adminHost+':'+config.adminPort+'/'+req._parsedUrl.path ,function( response ){
            var str="";
            if( response.statusCode != 200 ){
                res.json({ code: response.statusCode,message:response.statusMessage }); 
            }
            response.on("data",function(chunk){
                res.json( JSON.parse( chunk ) )
            })
            response.on("end",function(){
                console.log( str.toString() )
            })
        })
    },
    post( req , res , filepath ){
        let data = req.body;
        var options = {
            headers: {
                'Content-Type': req.headers['content-type'],
                'Authorization': localStorage.getItem("user"+ req.headers.authorization ), 
            },
            url: 'http://'+config.adminHost+':'+config.adminPort+req._parsedUrl.path,
            method: 'POST',
            json:true,
            body: data
        };
        request(options, function( error, response, data ){
            if (!error && response.statusCode == 200) {
                res.json( data )
            }else{
                res.json( { code:1,message:"fail" } )
                console.log(response.statusCode)
            }
        });
    }, 
    /**
     * 
     * @param {*} req  request 对象
     * @param {*} res  responese  对象
     * @param {*} filepath  文件路径
     * @param {*} filename  文件名称  name+扩展名
     */
    postFile( req , res , filepath , filename ){  
        var options = {  
            hostname:config.adminHost,
            port: config.adminPort,
            path: req._parsedUrl.path,
            method: 'POST'
        }
        //  模仿 浏览器传文件  
        var boundaryKey = '----' + req.headers['content-type'].split('----')[1];  //生成分隔数据
        fs.readFile( filepath , function (err, data) {  //读取需要上传的文件内容
            if( err ){
                res.json( { code:1, message : "node读取文件错误",error:err });
            }else{
                //拼装分隔数据段
                var payload = '--' + boundaryKey + '\r\n' + 'Content-Disposition:form-data; name="file"; filename="'+filename+'"\r\n' + 'Content-Type:text/plain\r\n\r\n';
                payload += data;
                payload += '\r\n--' + boundaryKey + '--';
                //发送请求
                var reqA = http.request(options, function (response) {
                    response.setEncoding('utf8');
                    response.on('data', function (chunk) {
                        res.json( JSON.parse( chunk ) );
                    });
                    fs.unlink(filepath, function( err ){   //  上传文件之后  删除文件 
                        // if(err){
                        //      throw err;
                        // }
                    })
                });
                
                reqA.on('error', function(e) {
                    console.error("error:"+e);
                });
                //把boundary、要发送的数据大小以及数据本身写进请求
                reqA.setHeader('Content-Type', req.headers['content-type']);
                reqA.setHeader('Connection', 'keep-alive');
                reqA.setHeader('Content-Length', Buffer.byteLength(payload, 'utf8'));
                reqA.setHeader('Authorization', localStorage.getItem("user"+ req.headers.authorization ));
                reqA.write(payload);

                reqA.end();
            }
        });  
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值