egg.js 动态转发代理
时间:2022-07-26
本文章向大家介绍egg.js 动态转发代理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 需求背景利用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 /*
* @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() } };};
- 使用Apache API监控Uber的实时数据,第3篇:使用Vert.x的实时仪表板
- 走进科学:我是如何“黑了”星级酒店的
- OpenSSL空指针引用do_ssl3_write
- 针对近期“博全球眼球的OAuth漏洞”的分析与防范建议
- 黑掉美国(英国、澳大利亚、法国等)的交通控制系统
- Android 自定义标签 ViewLayout
- Identity Service - 解析微软微服务架构eShopOnContainers(二)
- 机器学习之随机森林
- Catalog Service - 解析微软微服务架构eShopOnContainers(三)
- EventBus In eShop -- 解析微软微服务架构Demo(四)
- Health Check in eShop -- 解析微软微服务架构Demo(五)
- Android Studio相见恨晚的操作锦集
- [收藏]几个常用的用正则表达式验证字符串的函数
- 走进科学: 无线安全需要了解的芯片选型、扫描器使用知识
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Mac上安装tesseract-OCR
- 6.02-news_re
- 6.03-news_xpath2
- 修改mysql密码
- 6.04-news_xpath3
- 6.05-btc
- 7.01-beautiful_soup
- mysql导入导出数据
- 7.01-beautiful_soup2
- 7.01-beautiful_soup3
- CentOS7上安装 JDK8 Hadoop Hive
- 7.02-bs4_btc
- [已解决]报错:UnicodeEncodeError: 'latin-1' codec can't encode characters in position 80-81
- 8.02-json_use
- Scrapy问题