知识大部分来自于:
https://juejin.cn/post/6861197669927878670
https://juejin.cn/post/6844903976941387784
这里做一下整理。
依赖库
npm i http-proxy-middleware koa2-connect
注意
 application/x-www-form-urlencoded 转发代理要定制解决否则活转发失败  。
配置文件
在路径\config\config.default.js里面添加配置:
// add your middleware config hereconfig.middleware = ['proxy'];// 忽略安全威胁csrf的防范config.security = {csrf: {enable: false,},}//代理配置信息config.proxyConfig = {target: "",Rewrite: {'^/test': ""},};
添加proxy.js中间件
在路径\app\middleware\添加proxy.js。
/** @Description: api 网关代理* @Author: 吴文周* @Github: 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('/test', {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 headerproxyReq.setHeader('content-type', 'application/x-www-form-urlencoded');proxyReq.setHeader('content-length', body.length);// Write out body changes to the proxyReq streamproxyReq.write(body);// proxyReq.end();} else {next()}} catch (error) {console.log(error);}}}));await Proxy(ctx, next);} catch (error) {console.log(error)next()}};};
结束
最后启动即可。
