前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >egg.js 动态转发代理

egg.js 动态转发代理

作者头像
吴文周
发布2020-10-15 15:03:02
2.1K0
发布2020-10-15 15:03:02
举报
文章被收录于专栏:吴文周的专栏吴文周的专栏
  • 需求背景利用nodejs和consul实现注册中心和网关
  • egg.js在获取配置信息与节点后进行服务转发与路径管理
  • 实现难点没有成行的技术博客去解决这个问题

解决方案

  • 依赖http-proxy-middleware和koa2-connect
  • 重点问题application/x-www-form-urlencoded 转发代理要定制解决否则活转发失败
  • 配置文件中添加代理配置信息
  • // 忽略安全威胁csrf的防范 config.security = { csrf:{ enable: false } } //代理配置信息 config.proxyConfig = {}; // add your middleware config here config.middleware = ['proxy'];
  • 在中间件中添加代理js
  • proxy.js /*
代码语言:javascript
复制
* @Description: api 网关代理 
* @Author: 吴文周
* @Github: http://gitlab.yzf.net/wuwenzhou 
* @Date: 2020-06-28 13:38:19 
* @LastEditors: 吴文周
* @LastEditTime: 2020-08-13 18:14:32 
*/
const { createProxyMiddleware } = require('http-proxy-middleware');
const k2c = require('koa2-connect');
module.exports = (options,app) => {  
return async function(ctx,next) {  let proxy= app.config.proxyConfig;  
  try {      
    const Proxy = k2c(createProxyMiddleware('/api',{ 
    target: proxy.target,// 动态设置可以从缓存中获取更新       
    pathRewrite:proxy.Rewrite,// 动态设置可以从缓存中获取更新        
    changeOrigin: true,        
    secure: false,        
    body:ctx.request.body,        
    onProxyReq:(proxyReq, req, res, options)=>{          
    const contentType = proxyReq.getHeader('Content-Type'); 
    // 特殊判断如果类型是application/x-www-form-urlencoded 转发代理需要特殊处理      
    try {           
     if (contentType && contentType.indexOf('application/x-www-form-urlencoded')>=0) {
              let body = Object.keys(options.body).map(function(key) {   
               return encodeURIComponent( key ) + '=' + encodeURIComponent(options.body[key])
              }).join('&');              
 //Update header              
proxyReq.setHeader('content-type', 'application/x-www-form-urlencoded');              
proxyReq.setHeader('content-length', body.length );             
 // Write out body changes to the proxyReq stream              
proxyReq.write(body);              
// proxyReq.end();           
 }       
   } catch (error) {      
      console.log(error);          }        }      }));     
 await Proxy(ctx,next);    }else{      next()    }    } catch (error) {      console.log(error)      next()    }  };};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决方案
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档