节点代理访问
<强> 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为写死的要携带的饼干