节点代理访问的实现

  

节点代理访问

  

<强> 1。场景

  
      <李>本地开发,代理访问,防止跨域(一般通过webpack配置代理即可),特殊情况如携带一些自定义的登录饼干则需要通过自己写节点李   <李>作为一种服务器中间层,单线程异步可以缓解服务器压力。长链接websocket通常使用节点搭建李   
  

<强> 2。技术框架

  
      <李>节点——koa2体量小,轻便易用。   <李>路由koa-router高雅配套路由,中间件支持异步李   <李> koa2-request基于异步对请求的封装,这里本人git上找的,可靠性带考量,若基于生产环境建议使用请求自行封装李   <李> koa-bodyparser请求参数解析格式化,中间件   
  

<强> 3。上代码

  

3.1创建应用app.js

        const高雅=要求(“高雅”)   const bodyParser=要求(“koa-bodyparser”)//路由   const路由器=要求(“。/路由器”)   const应用=new高雅()      app.use (   bodyParser ({//返回的对象是一个键值对,当扩展为假的时候,键值对中的值就为“字符串”或“数组”形式,为真正的时候,则可为任何数据类型。   扩展:真   })   )   之前      

3.2允许跨域app.js

        接下来app.use(异步(ctx)=比;{   ctx。集(‘Access-Control-Allow-Origin’,‘*’)   ctx。集(“Access-Control-Allow-Headers”、“内容类型”)   ctx.set (   “Access-Control-Allow-Methods”,   ”选项,,头、PUT、POST、DELETE补丁”   )   等待下一个()   })   之前      

3.2使用路由

     //app.js      app.use (router.routes ())//router.js      const路由器=要求(“koa-router”)   让koaRequest=要求(“。/httpRequest”)   const路由器=new路由器()      路由器。get(“/*”,异步(ctx,)=比;{   const url=setQuestUrl (ctx.url)   尝试{   让res=等待koaRequest (url,‘得到’,ctx)   ctx。身体=res   }捕捉(err) {   ctx。身体=犯错   }   })      路由器。邮报》(“/*”,异步(ctx,)=比;{   const url=setQuestUrl (ctx.url)   尝试{   让res=等待koaRequest (url,“文章”,ctx)   ctx。身体=res   }捕捉(err) {   ctx。身体=犯错   }   })      函数setQuestUrl (url) {   如果(/^ \/t/test (url)) {   返回“host1”+ url。替换(/^ \/t/,”)   }   如果(/^ \/xt/test (url)) {   返回“host2”+ url。替换(/^ \/xt/?   }   }      模块。=出口路由器   之前      
      <李>路由器。get(“/*”,异步(ctx,)=比;{})高雅路由“/*”为通配符,匹配所有得到请求;下一方法调用表示进入下一个中间件;李   <李> ctx请求上下文,ctx.request。李的身体后请求参数   <李>高雅的中间件原理洋葱圈模型:李   
  

节点代理访问的实现

        const高雅=要求(“koa2”);   const应用=new高雅();//日志记录器   接下来app.use(异步(ctx)=比;{   控制台。日志(“第一层洋葱——开始”)   等待下一个();   const rt=ctx.response.get (“X-Response-Time”);   console.log (“$ {ctx。}$ {ctx方法。url} - $ {rt}”);   控制台。日志(“第一层洋葱——结束”)   });//x-response-time   接下来app.use(异步(ctx)=比;{   控制台。日志(“第二层洋葱——开始”)   const开始=Date.now ();   等待下一个();   const=Date.now女士()——开始;   ctx。集(“X-Response-Time”、“${}女士女士”);   控制台。日志(“第二层洋葱——结束”)   });//响应   app.use(异步ctx=比;{   控制台。日志(“第三层洋葱——开始”)   ctx。身体=癏ello World”;   控制台。日志(“第三层洋葱——结束”)   });      app.listen (8000);//输出      第一层洋葱——开始   第二层洋葱——开始   第三层洋葱——开始      第三层洋葱——结束   第二层洋葱——结束   第一层洋葱——结束      

setQuestUrl此方法主要是将前端访问的路径,根据第一级转发到不同的主机上

  

例如:/t→host1

  

3.3转发请求httpRequest.js

  

本例主要为了代理访问并携带饼干,const。js为写死的要携带的饼干

节点代理访问的实现