知识大部分来自于:
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 here
config.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 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();
} else {
next()
}
} catch (error) {
console.log(error);
}
}
}));
await Proxy(ctx, next);
} catch (error) {
console.log(error)
next()
}
};
};
结束
最后启动即可。