结节代理访问
1.场景
本地开发,代理访问,防止跨域(一般通过工具配置代理即可),特殊情况如携带一些自定义的登录甜饼干则需要通过自己写结节作为一种计算机网络服务器中间层,单线程异步可以缓解服务器压力。长链接求转发到通常使用结节搭建2.技术框架
节点- koa2体量小,轻便易用。路由寇阿相思树路由器配套路由,中间件支持异步科威特石油公司2-请求基于异步非同步(异步)对请求的封装,这里本人饭桶上找的,可靠性带考量,若基于生产环境建议使用请求自行封装koa-bodyparser请求参数解析格式化-中间件3.上代码
3.1 创建应用app.js
const Koa=require(' Koa ')const body解析器=require(' Koa-body解析器')//路由const router=require(' ./router’)const app=new Koa()app。使用(BodyParser({//返回的对象是一个键值对,当延长为错误的的时候,键值对中的值就为"字符串"或"数组"形式,为真实的的时候,则可为任何数据类型扩展: true })3.2允许跨域app.js
app.use(async (ctx,next)={ CTX。设置('访问控制-允许-来源',' * ' CTX)。设置(“访问控制-允许标题”、“内容类型”)CTX。设置(访问控制允许方法,选项,获取,头,放,后,删除,补丁)等待next()})3.2使用路由
//app。jsapp。使用(路由器。routes())//路由器。jsconst Router=require(' KOA-Router ')让koaRequest=require(' ./http request)const router=new router()router。get('/*,async (ctx,next)={ const URL=setquesturl(CTX。URL)尝试{让RES=wait koarequest(URL,' get ',ctx) ctx。身体=RES }捕捉(错误){ CTX。body=err } })路由器。post('/*,async (ctx,next)={ const URL=setquesturl(CTX。试试CTX .测试(URL)){返回“主机1”url.replace(/^/t/,')} if(/^/xt/.测试(URL)){返回“主机2”url.replace(/^/xt/,')} }模块。exports=routerrouter。get('/*,async (ctx,next)=})KOA路由'/*' 为通配符,匹配所有得到请求;然后方法调用表示进入下一个中间件;中强请求上下文,ctx.request.body post请求参数寇阿相思树的中间件原理洋葱圈模型
const Koa=require(' Koa 2 ');const app=new Koa();//loggerapp.use(async (ctx,next)={ console.log('第一层洋葱-开始)等待下一个();const rt=CTX。回应。get(' X-响应时间');控制台。日志(` $ { CTX。方法} $ { CTX。URL }-$ { rt } `);console.log('第一层洋葱-结束')});//x-响应时间应用程序。使用(异步(CTX,下一个)={ console.log('第二层洋葱-开始)const start=date。now();等待下一个();const ms=日期。now()-start;CTX。集合(' X-响应时间、`$ { ms } ms `);console.log('第二层洋葱-结束')});//响应app。使用(异步CTX={控制台。日志('第三层洋葱-开始)CTX . body=' Hello world console . log('第三层洋葱-结束')});app。听(8000);//输出第一层洋葱-开始第二层洋葱-开始第三层洋葱-开始第三层洋葱-结束第二层洋葱-结束第一层洋葱-结束setQuestUrl此方法主要是将前端访问的路径,根据第一级转发到不同的宿主上
例如:/t - host1
3.3 转发请求httpRequest.js
本例主要为了代理访问并携带Cookie,const.js为写死的要携带的甜饼干
让koa2Req=require('koa2-request ')让constConfig=require(' ./const’)让iToken=const config。itokenlet koaRequest=异步函数(url,method,CTX){ let options={ method : method,uri: url,timeout: 120000,body: ctx?{ .ctx.request.body } : null,headers: { },js : true//自动将正文字符串化为JSON }选项。标头[' Cookie ']=' I-token=$ { iToken } `//设置cookie让RES=等待koa2Req(选项)返回RES . body }//node-monasync函数getTestToken() { if(!{让网址=`http://xt.eqxiu.com/tui/app/radar/test/getToken?公司id=$ { const config。公司id }员工id=$ { const config。员工id } `尝试{让RES=等待koaRequest(URL,' GET ')iToken=RES . obj控制台。日志('令牌已拿到:' iToken)} catch(e){ console。log(e)} } } getTestToken()模块。导出=koaRequest3.4最后设置端口等
const app=require(' ./app ')//const createWebsocket=require ' ./web socket)const server=require(' http ').创建服务器(应用程序。回调())服务器。settimeout(2 * 60 * 1000)//设置超时时间const { PORT=3000 }=process。env服务器。listen(PORT,()={ console.log(`侦听端口$ { PORT } `))})3.5本地开发,热重启
安装nodemon
纱线添加节点设置忽略监听
nodemon.josn节点项目根目录下
{"忽略" :[' node _ modules/*]//忽略节点_模块下文件修改的监听}package.josn
通过新公共管理运行服务器启动
{ ' dependencies ' : { ' KOA ' : '^2.8.1',' KOA-body parser ' : '^4.2.1',' KOA-router ' : '^7.4.0',' KOA 2-request ' : '^1.0.4',' nodemon ' : '^1.19.1' },' scripts ' : { ' server ' : ' nodemon index。js ' } }以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。