通过nodejs代理服务器解决跨域问题

1、本段代码用于解决前后端分离过程中产生的跨域问题。原理上是使用代理转发。使用nodejs语法编写,需要运行在nodejs环境下。

2、使用方法

      1、普通ajax请求的url需要改成代码中监听的路由和端口。

      2、需要在ajax请求中添加额外添加2个参数,一,baseUrl真实访问接口的host地址;二,pathUrl需要访问的接口的path地址。

const url = require('url');
const http = require('http');
const https = require('https'); // cnode是https协议
//导入querystring模块(解析post请求数据)
var querystring = require('querystring');

const server = http.createServer((req, res) => {
  //var params = req.url.toString(1, req.url.length);
  //var params = url.parse(req.url, true).query;
  var data = '';

  if (req.method == "GET") {
    data = url.parse(req.url, true).query;
    data = JSON.stringify(data);

    let opt = {
      hostname: '',
      method: req.method,
      path: '',
      headers: {
        "Content-Type": 'application/json',
        "Content-Length": data.length
      }
    }
  
    if(data){
      opt.hostname = JSON.parse(data).baseUrl;
      opt.path = JSON.parse(data).pathUrl;
    }
  
    let body = '';
    let breq = https.request(opt, function (bres) {
      bres.on('data', function (data) {
        body += data;
      }).on('end', function () {
        res.writeHead(200, {
          'Access-Control-Allow-Origin': '*',
          "Access-Control-Allow-Methods": "*",
          "Access-Control-Allow-Headers": "Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE,X-URL-PATH,x-access-token"
        })
        res.end(body);
      });
    }).on('error', function (e) {
      console.log("error: " + e.message);
    })
  
    breq.write(data);
    breq.end();
  } else {
    req.on('data',function(r){
      data += r;
    })
    req.on('end', function () {
      var opt = {
        hostname: '',
        method: req.method,
        path: '',
        headers: {
          "Content-Type": 'application/json',
          "Content-Length": data.length
        }
      }
    
      if(data){
        opt.hostname = JSON.parse(data).baseUrl;
        opt.path = JSON.parse(data).pathUrl;
      }

      let body = '';
      let breq = https.request(opt, function (bres) {
        bres.on('data', function (data) {
          body += data;
        }).on('end', function () {
          res.writeHead(200, {
            'Access-Control-Allow-Origin': '*',
            "Access-Control-Allow-Methods": "*",
            "Access-Control-Allow-Headers": "Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE,X-URL-PATH,x-access-token"
          })
          res.end(body);
        });
      }).on('error', function (e) {
        console.log("error: " + e.message);
      })
    
      breq.write(data);
      breq.end();
    })
  }
}).listen(3000, '127.0.0.1');

console.log('监听 127.0.0.1:3000,服务已启动');

猜你喜欢

转载自www.cnblogs.com/casicloud-lj/p/10141892.html