Node实现中间层转发解决跨域,express-http-proxy

  • app.js(所在端口:3000)
axios.get('http://127.0.0.1:3001/proxy/api/search') // 向3001端口请求数据
      .then(res => res.data)
      .then(res => console.log(res.data))

  • server.js (开启端口3001)
let express = require('express')
var proxy = require('express-http-proxy');

let app = express()


// 浏览器与服务器有同源策略限制,服务器与服务器之间没有同源策略限制
// 下面解决同源策略跨域问题,因为当前端口为3001,而前端请求端口为3000
app.all('*', function (req, res, next) {//必须卸载app.get前面才有效
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By", ' 3.2.1');
    if (req.method == "OPTIONS") {
        res.send(200);
        /*让options请求快速返回*/
    } else {
        next();
    }
});

// ‘proxy’表示所匹配到的url以 /proxy开头的都会由这里的中间层转发
// 'http://127.0.0.1:3001/proxy/api/search'  前端请求pathname以/proxy开头所以会被这个中间层转发到目标url

app.use('/proxy', proxy( 
    'http://127.0.0.1:4000',  // 目标域名,只能写域名,不能带上pathname
    {
        proxyReqPathResolver: function(request) {
            console.log(request.baseUrl)  // '/proxy'
            console.log(request.url) // ' /api/search'
            return request.url // 目标数据的pathname,必须有
        },
    }
));


let server = app.listen(3001,function(){ /
    var port = server.address().port;
    console.log('服务开启成功端口号是:'+port)
})
  • server1.js (当前服务开启的端口4000,也是目标数据所在服务)
let express = require('express')
let app = express()

因为中间层服务3001端口和这里的服务的端口4000不一样,也不用解决跨域,因为服务器之前不存在跨域
app.get('/api/search',function(req,res){
    res.json({
        errno:0,
        data:{
            test:333
        }
    })
})

let server = app.listen(4000,function(){
    var port = server.address().port;
    console.log('服务开启成功端口号是:'+port)
})


猜你喜欢

转载自blog.csdn.net/qq1498982270/article/details/88694502
今日推荐