小程序环境切换问题

2024-03-22 09:27:08 +08:00
 seedhk

大佬们早上好!

公司是做小程序的,需要连接后端服务器请求数据。 当前公司有一套测试环境服务器和生产环境服务器。测试环境通过 IP 访问,生产环境通过 IP 或者域名访问。

但是有时候会发生上线前检查不仔细,测试环境的 IP 被带到了生产环境,导致生产环境的小程序不可用。

我想过一个方案,就是测试环境和生产环境都使用域名进行访问后端服务,在测试环境使用修改 hosts 的方式来修改域名对应的 IP ,但是放在小程序上这招不行。

除了上线之前加强检查,生成体验版本进行尝试以外,从技术的角度,有办法解决吗? 谢谢

2626 次点击
所在节点    程序员
20 条回复
gdfsjunjun
2024-03-22 09:29:16 +08:00
小程序开发工具那里,页面参数之类的传个值,规定开发环境。默认不填就是生产环境。那不就好了。部署不用做任何修改。
gdfsjunjun
2024-03-22 09:30:04 +08:00
这就相当于环境变量,你再去总 API 配置那里,写好业务逻辑,搞定。
meshell
2024-03-22 09:32:29 +08:00
```js
const accountInfo = wx.getAccountInfoSync();
this.globalData.env = accountInfo.miniProgram.envVersion;
let baseUrl = 'https://api.xxxx.com';
if (this.globalData.env === 'develop') {
baseUrl = 'https://beta-api.xxxx.com';
}
```
我是这样的处理的。
sentinelK
2024-03-22 09:33:26 +08:00
这个是软件工程的典型错误,既不应该在进入测试阶段后仍然修改代码。无论是任何理由。

所以:
1 、通过 url 的特殊调试参数。
2 、通过反向代理服务的方式调整 API 的 IP 指向。

一般来讲,成熟的产品都会选择方法 2 ,因为方法 2 不光会实现此功能,也是灰度更新、热回退等版本管理的基础机制。
hoshizukiko
2024-03-22 09:35:28 +08:00
我们是一个标准文件,上线发版前手动改为生产环境再提交,git 上都是测试环境
GNightDearLamb
2024-03-22 09:35:28 +08:00
你可能需要的是 wx.getAccountInfoSync()
loveyu
2024-03-22 09:35:44 +08:00
秘籍开关,切换环境
ToDayMkCode
2024-03-22 09:38:00 +08:00
1.config 配置文件, 例如:const mode = 'dev' // dev | pro
2.脚本上传代码: 例如:npm run dev || npm run build (实际上也是修改配置)
3.两个微信小程序,一个是测试环境 一个是正式环境
Light3
2024-03-22 09:43:54 +08:00
最简单写个参数呗..
还不行 就切域名呗
seedhk
2024-03-22 09:50:19 +08:00
@meshell @GNightDearLamb 这个方法很适合,看来还是得先去搜下文档,这个问题明明官方文档就能解决我却没去搜,实在是不应该。

谢谢大佬们!
duanxianze
2024-03-22 09:58:27 +08:00
管理问题不应该考虑技术解决
Elissa
2024-03-22 10:21:19 +08:00
@seedhk 考虑使用网关,可以在网关控制台进行切换,也可以做灰度发布
darklinden
2024-03-22 10:33:48 +08:00
1. 自己在内网搭 dnsmasq 跳测试服务 ip
2. 在登陆时为测试账号授权并推送服务切换
3. 记得做独特的标记展示来让测试时可以确定当前是哪个服务
justplaymore
2024-03-22 10:41:20 +08:00
小程序里始终有多套环境参数,在构建的时候指定环境变量来决定走哪套环境。
qsnow6
2024-03-22 11:33:50 +08:00
改 DNS 就完事了
Liyiko
2024-03-22 11:52:03 +08:00
@meshell 正解,小程序有自己的变量区别环境

也可以把域名放进配置里做自动化部署

const accountInfo = uni.getAccountInfoSync()
const envVersion = accountInfo.miniProgram.envVersion

import siteConfig from '@/utils/config.js'

let baseUrl = ''
if (envVersion === 'develop') {
baseUrl = siteConfig.devBaseUrl
} else {
baseUrl = siteConfig.prodBaseUrl
}
cameron321
2024-03-22 13:32:10 +08:00
@Liyiko 谢谢大佬。我也存在这个问题。之前百度搜都没结果。之前都是手动修改 baseUrl 的。谢谢大佬
MMDeJeVS3GtMVLeu
2024-03-22 14:00:46 +08:00
如果有 build 这个过程可以参考一下这个,使用环境变量:

"test": "cross-env BUILD_ENV=test node ./ci/prebuild.js && cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service --mode test uni-build --watch"

"build-test": "cross-env BUILD_ENV=test node ./ci/prebuild.js && cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service --mode test uni-build --minimize && cross-env ROBOT=2 node ./ci/autoUpload.js"
sujin190
2024-03-22 14:11:20 +08:00
@seedhk #10 其实可以参考安卓进开发者模式的逻辑,在关于或者 logo 之类的留个长按 3-5 次之类的可以调出开发配置之类的,默认写的都是生产环境,测试就让测试人员手动调整到测试环境去,还有什么日志等级、调试工具条什么的也可以放里边,而且吧其实这个到正式版其实也是有用的,比如某些不太方便在生产环境复现的逻辑也许正式版上切换调试 bug 流程的也很方便
chf007
2024-03-22 14:37:41 +08:00
根本问题其实不就是把会变的地址写死在了代码中了么,你们可能每变一次环境还要手工改一下再提交吧。

可以查查环境变量是怎么用的,dotenv 是怎么用的。一般用了框架了的话都有成熟的解决方案。完全原生,也要想想怎么写个构建脚本。

最后把 CI/CD 用起来。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1025948

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX