跨域之代理服务

代理服务

  • 跨域解决方法一(jsonp)
  • 跨域解决方法二(CORS)
  • 跨域是浏览器规范,通过同服务器请求数据,不通过浏览器请求,也能解决浏览器限制;
  • 代理服务转发请求
  • 利用http模块实现简单的服务器转发
  • 利用 koa-server-http-proxy中间件实现代理
  • 正向代理
    正向代理
  • 反向代理
    反向代理

http模块实现代理

  • node.js既可以做客户端也可以做服务端
  • 利用这个特性,可以再提供一个代理服务,去访问其他的服务器
  • 如果不满足静态代理,那么就执行代理服务
const Koa = require('koa');
const http = require('http');
const app = new Koa();
app.use(async (ctx, next) => {
    console.log("代理服务");
    if (ctx.request.url == '/api') {
        // 请求http://localhost:8081/getPhotos
        //请求代理
        // 不受同源策略的限制
        let data =  await proxyRequest(ctx);
        ctx.body = data;
    }
    await next();
})
//静态代理
app.use(KoaStaticCache('./public', {
    prefix: '/public',
    gzip: true,
    dynamic: true
}));

app.listen(8083);

function proxyRequest(ctx){
    const options = {
        protocol: 'http:',
        hostname: 'localhost',
        port: 8081,
        path: '/getPhotos',
        method: 'get',
        headers: ctx.request.header
    };
    return new Promise(resolve => {
        const req = http.request(options, res =>{
            res.on('data', (chunk) => {
                console.log(`BODY: ${chunk}`);
                data += chunk.toString();
            });
              res.on('end', () => {
                console.log('data',data);
                resolve(data);
            });
              req.write('');
              req.end;
        });
    })
}

koa-server-http-proxy中间件实现代理

const Koa = require('koa');
const proxy = require('koa-server-http-proxy');
const KoaStaticCache = require('koa-static-cache');
const app = new Koa();
// 正向代理
app.use(proxy('/api', {
    target: 'http://localhost:8081',
    pathRewrite: { '^/api': '' },
    // changeOrigin: true
  }))
//静态代理
app.use(KoaStaticCache('./public', {
    prefix: '/public',
    gzip: true,
    dynamic: true
}));
app.listen(8082);

此时须在原请求地址上加/api:

function loadPhotos() {
    ajax({
        method: "get",
        url: "/api/getPhotos",  //注意
        success(data) {
            data = JSON.parse(data);
            if(Array.isArray(data)){
                data.forEach(d => {
                    createLi(d);
                });
            } 
        }
    })
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值