前端跨域方案-跨域請求代理(node服務)


前端開發人員在本地搭建node服務,調用接口首先走本地服務,然后轉發到api站點,node服務代碼如下:

var express = require('express'),
    request = require('request'),
    bodyParser = require('body-parser'),

    app = express();
app.use(require('cookie-parser')());
var myLimit = typeof(process.argv[2]) != 'undefined' ? process.argv[2] : '100kb';

app.use(bodyParser());
app.use(express.static(__dirname+'/lingfo'));
app.use('/api', function (req, res, next) {
    
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET, PUT, PATCH, POST, DELETE");
    res.header("Access-Control-Allow-Headers", req.header('access-control-request-headers'));

    if (req.method === 'OPTIONS') {
        res.send();
    } else {
        //讀取cookie
        var cookie = require('cookie');
        var parse = require('./lib/parse');
        
        var cookies = req.headers.cookie;    //保存對象地址,提高運行效率
        
        req.cookies = cookie.parse(cookies);    //與express中調用cookie.serialize()對應,解析cookie
        req.cookies = parse.JSONCookies(req.cookies);    // JSON字符序列轉化為JSON對象
        console.log(req.cookies['token']);
        
        var targetURL = 'http://api.***.com/api';
        if (!targetURL) {
            res.send(500, { error: 'There is no Target-Endpoint header in the request' });
            return;
        }
        var path='';
        if(req.url.indexOf('?')<=0){
            path = req.url+'?token='+req.cookies['token'];
        }
        else{
            path = req.url+'&token='+req.cookies['token'];
        }
        request({ url: targetURL + path, method: req.method, json: req.body, headers: {'Authorization': ''} },
            function (error, response, body) {
                if (error) {
                    console.error('error: ' + response.statusCode)
                }
            }).pipe(res);
    }
});
//定制404頁面
app.use(function(req,res,next){
    res.status(404);
});
app.set('port', process.env.PORT || 80);

app.listen(app.get('port'), function () {
    console.log('Proxy server listening on port ' + app.get('port'));
});

node接口代理是在一個github的基礎上修改的,增加讀取認證cookie然后發送到接口站點實現認證的

參考github地址:https://github.com/ccoenraets/cors-proxy


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM