知识大部分来自于:
https://juejin.cn/post/6861197669927878670
https://juejin.cn/post/6844903976941387784
这里做一下整理。

依赖库

  1. npm i http-proxy-middleware koa2-connect

注意

application/x-www-form-urlencoded 转发代理要定制解决否则活转发失败 。

配置文件

在路径\config\config.default.js里面添加配置:

  1. // add your middleware config here
  2. config.middleware = [
  3. 'proxy'
  4. ];
  5. // 忽略安全威胁csrf的防范
  6. config.security = {
  7. csrf: {
  8. enable: false,
  9. },
  10. }
  11. //代理配置信息
  12. config.proxyConfig = {
  13. target: "",
  14. Rewrite: {
  15. '^/test': ""
  16. },
  17. };

添加proxy.js中间件

在路径\app\middleware\添加proxy.js

  1. /*
  2. * @Description: api 网关代理
  3. * @Author: 吴文周
  4. * @Github: gitlab.yzf.net/wuwenzhou
  5. * @Date: 2020-06-28 13:38:19
  6. * @LastEditors: 吴文周
  7. * @LastEditTime: 2020-08-13 18:14:32
  8. */
  9. const {
  10. createProxyMiddleware
  11. } = require('http-proxy-middleware');
  12. const k2c = require('koa2-connect');
  13. module.exports = (options, app) => {
  14. return async function (ctx, next) {
  15. let proxy = app.config.proxyConfig;
  16. try {
  17. const Proxy = k2c(createProxyMiddleware('/test', {
  18. target: proxy.target, // 动态设置可以从缓存中获取更新
  19. pathRewrite: proxy.Rewrite, // 动态设置可以从缓存中获取更新
  20. changeOrigin: true,
  21. secure: false,
  22. body: ctx.request.body,
  23. onProxyReq: (proxyReq, req, res, options) => {
  24. const contentType = proxyReq.getHeader('Content-Type');
  25. // 特殊判断如果类型是application/x-www-form-urlencoded 转发代理需要特殊处理
  26. try {
  27. if (contentType && contentType.indexOf('application/x-www-form-urlencoded') >= 0) {
  28. let body = Object.keys(options.body).map(function (key) {
  29. return encodeURIComponent(key) + '=' + encodeURIComponent(options.body[key])
  30. }).join('&');
  31. //Update header
  32. proxyReq.setHeader('content-type', 'application/x-www-form-urlencoded');
  33. proxyReq.setHeader('content-length', body.length);
  34. // Write out body changes to the proxyReq stream
  35. proxyReq.write(body);
  36. // proxyReq.end();
  37. } else {
  38. next()
  39. }
  40. } catch (error) {
  41. console.log(error);
  42. }
  43. }
  44. }));
  45. await Proxy(ctx, next);
  46. } catch (error) {
  47. console.log(error)
  48. next()
  49. }
  50. };
  51. };

结束

最后启动即可。