[技术讨论] 1个前端牛马的顶级觉悟,同时联调多个后端!

[复制链接]
 楼主| 科叼 发表于 2025-2-24 15:08 | 显示全部楼层 |阅读模式

场景
同样的接口,同样的前缀,只是后端地址不一样,怎么同时代理多个地址呢?也就是一个前端,怎么连接多个后端的地址?

1、一个前端,需要同时和N个后端联调
2、一个需求里有若干个模块,分别给不同的后端开发,前端需要和N个后端联调
3、本地开启一个端口给测试,然后你需要去做其他的需求,但是其他的需求需要连接另一个后端接口
4、其他情况,总之:1个前端 VS N个后端

上述场景,都是一个前端,联调N个后端的场景,你可能没遇到过,但是确实存在上述的场景。尤其是第三种最为常见,你会一直等测试完了、再去换一个后端代理地址接着开发吗?当然不能,这样做很浪费时间,说明你不是一个合格的牛马,牛马的觉悟不够,牛马是不会让自己闲着的。

那么,怎么办呢?和A联调时proxy指向url-A,和B联调时proxy指向url-B……换其他人联调时,你是把本地项目关掉,然后换个proxy代理、再重启一下吗?

当然可以,如果你不嫌麻烦的话!那么有没有好办法呢?

这个问题问得好,当然有了!

看新机会
技术大厂,多地base,给的待遇还不错,感兴趣可以试试~
前、后端or测试>>>直通机会https://jsj.top/f/o38ijj

解决方案

思路
既然vue.config.js能代理一个proxy,那么能不能代理多个proxy呢?当然能!


实现步骤
创建项目

创建一个空的vue2项目

vue create project-name

默认情况下,npm run serve会启动8080端口

目标
我希望不同的端口,指向不同的后端代理proxy地址,如:

1、8100端口,代理后端7001端口
2、8105端口,代理后端7002端口
没毛病吧?本文以代理2个后端为例,其余的大家自行补充

前端配置
安装cross-env
yarn add cross-env

cross-env是nodejs设置环境变量的工具,它解决了不同操作系统之间环境变量设置语法不一致的问题,具体可自行搜索

配置vue.config.js
  1. const { defineConfig } = require('@vue/cli-service')

  2. module.exports = defineConfig({
  3.   transpileDependencies: true,
  4.   // webpack-dev-server 相关配置
  5.   devServer: {
  6.     host: '0.0.0.0',
  7.     port: process.env.PORT || 8100,
  8.     open: false,
  9.     proxy: {
  10.       '/api': {
  11.         target: getProxyTarget(process.env.PORT),
  12.         changeOrigin: true,
  13.         pathRewrite: { '^/api': '' }
  14.       }
  15.     },
  16.   },
  17. })

  18. function getProxyTarget(port) {
  19.   switch (port) {
  20.     case '8100':
  21.       return 'http://127.0.0.1:7001'
  22.     case '8105':
  23.       return 'http://127.0.0.1:7002'
  24.     default:
  25.       return 'http://127.0.0.1:7001' // 默认代理地址
  26.   }
  27. }


上述代码,默认设置启动端口为8100,并且getProxyTarget函数可以根据不同的端口,指向不同的代理地址。

配置package.json
  1. {
  2.   "name": "more-proxy",
  3.   "version": "0.1.0",
  4.   "private": true,
  5.   "scripts": {
  6.     "serve": "vue-cli-service serve",
  7.     "serve:8005": "cross-env PORT=8105 vue-cli-service serve",
  8.     "build": "vue-cli-service build"
  9.   },
  10.   "dependencies": {
  11.     "cross-env": "^7.0.3",
  12.     "vue": "^2.6.14"
  13.   },
  14.   "devDependencies": {
  15.     "@vue/cli-service": "~5.0.0",
  16.     "vue-template-compiler": "^2.6.14"
  17.   },
  18.   "browserslist": [
  19.     "> 1%",
  20.     "last 2 versions",
  21.     "not dead"
  22.   ]
  23. }


上述代码,重点是serve:8005这行,就是你要代理哪个端口,这里需要你在vue.config.js写对应的映照proxy

测试
上述配置已经实现了我们的需求,那么,具体测试一下吧。

本地启动两个nodejs服务,分别为7001和7002端口,内容如下

  1. /// 7001端口
  2. const http = require('http');

  3. const hostname = '127.0.0.1';
  4. const port = 7001;

  5. const server = http.createServer((req, res) => {
  6.   res.statusCode = 200;
  7.   res.setHeader('Content-Type', 'text/plain');
  8.   res.end('my port is 7001!');
  9. });

  10. server.listen(port, hostname, () => {
  11.   console.log(`Server running at http://${hostname}:${port}/`);
  12. });

  1. /// 7002端口
  2. const http = require('http');

  3. const hostname = '127.0.0.1';
  4. const port = 7002;

  5. const server = http.createServer((req, res) => {
  6.   res.statusCode = 200;
  7.   res.setHeader('Content-Type', 'text/plain');
  8.   res.end('my port is 7002!');
  9. });

  10. server.listen(port, hostname, () => {
  11.   console.log(`Server running at http://${hostname}:${port}/`);
  12. });

然后前端把上面的2个端口启动,写一个测试函数

  1. mounted() {
  2.     fetch('/api').then(() => {})
  3. }


效果如下: 8100已经成功代理7001了



同样的,8105也代理了7002


——转载自作者:前端没钱

评论

这是高手的觉悟么  发表于 2025-2-25 08:10
飞思啦 发表于 2025-2-24 17:21 | 显示全部楼层
知识水平有限,看不懂vue啥的,上点C,哈哈哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

248

主题

258

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

248

主题

258

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部