Postman xmysql不切换环境缓存数据到本地
作者:River_WJ
背景
公司内部有个标准产品(对外开发API接口),该产品迭代过程中会产生很多版本,多环境。开发及联调过程中,代码经常要在不同版本,不同环境中进行切换。
联调过程中,需要使用不同环境配合Postman进行调试。其中大部分传参需要用到客户的ID或者企业的ID。
痛点
常规获取ID的的方法:
1. 连接对应的环境
2. 找到对应的数据库
3. 找到对应的表名
4. 输入sql查询语句并执行,查询到对应的id
5. 复制id到postman中
假设需要找3个id,则至少需要操作3倍以上的步骤才能完成接口发起。基于这种重复性动作比较多,考虑通过其他方法来解决该问题。
1. 想法1--后台提供接口
后台开发接口,提供查询对应的id接口。
1. 后台不愿意增加工作量
2. 产品一直在迭代。就算新版本有新增接口,但老版本(部署的老环境)并不具备新增接口的功能。
从实际情况出发考虑可行性,走不通。
2. 想法2--nodejs搭服务
利用nodejs启用服务,编写服务链接,通过postman调用接口,根据传参,连接不同的环境数据库,返回对应数据。
1. 用nodejs编写服务比较简单(可行)
2. 通过postman去调用接口,需要传参,意味着需要手动输入环境,或者配置不同的环境。(增加很多配置工作量)
3. node服务需要在调用接口前执行。(对于开发者来说比较简单,但对于测试组的小伙伴就不友好,增加工作量)
综合评估之后,想法2可行,但不友好。基本能满足开发的可行性,但对于测试同学来说,可能会有些配置的工作量,并不友好。
3. 想法3--自定义执行脚本
通过xmysql库,执行连接命令,可以连接不同的环境,并返回对应的数据。
连接方法如下:
// 启动
xmysql -h host_name -o port -u user_name -p user_password -d database_name// 通过浏览器访问account表
http://localhost:3000/api/account?_size=100&_p=0
注意:xmysql
请求列表数据时,每次最多返回100条
需求是在每个业务请求能够获取任意客户id, 想法是把account表数据全部缓存到本地postman中,在业务代码中,通过全局方法,从缓存数据找到对应的客户id。(联调过程中,基本数据没什么大变化,account表只需同步一次),postman全局方法请参考另外一篇文章:《Postman全局注册方法及对返回数据可视化处理》, 在postman开启一个请求业务,并在pre-request script
中编写同步数据代码
/* 获取个人数据 */ const personsObj = {} const getPersonData = (page) => { pm.sendRequest(`http://localhost:3000/api/account?_where=(status,eq,2)and(remove_flag,eq,0)&_size=100&_p=${page}`, (err, response) => { var data = response.json(); // 获取账户对应的id const psersonAccountMap = data.reduce((total, currentValue) => { const _account = currentValue.account.replace('+86-','') total[_account] = currentValue return total }, personsObj) if (data.length == 100) { getPersonData(++page) } else { pm.environment.set("psersonAccountMap", psersonAccountMap); // 数据缓存到环境变量中 } }) } getPersonData(0)
在每个业务中,获取客户的id的方法
const utils = eval(globals.loadUtils); // 全局方法引入 // 获取默认个人ID;不传参,取默认值,可传参:utils.getPerson('账号') let personSignerId = utils.getPerson()
启动xmysql服务虽然简单,就一条语句xmysql -h host_name -o port -u user_name -p user_password -d database_name
, 但每次都输入上面的执行语句, 每次都需要更改参数,也不是办法;此时想到用批量执行bat脚本来替代人工操作。
第一版:满足基本功能
创建linkDB.bat文件
注意:编码格式ANSI,否则中文会出现乱码
代码如下:
# @set database=database1 # @set database=database2 # @set database=database3 @set database=database4 @set host=xx.xx.xx.xx @set port=3306 @set user=xxx @set pwd=xxxxxxx start cmd /k "xmysql -h %host% -o %port% -u %user% -p %pwd% -d %database%"
通过解开注释,设置不同的环境。win系统下,直接执行bat文件即可链接。但每次通过修改注释也不是很直观,需要点开文件去编辑,繁琐的步骤也多。
第二版:参数预先设置
改进linkDB.bat文件
通过预设环境参数、数据库表,等信息到代码中,执行脚本后,通过命令行输入对应的环境和数据库表,最后执行xmysql
语句连接数据库
@echo off @set database='' @set host='' @set port='' @set user='' @set pwd='' Title DataBase Color 0A :setep1 echo. echo 【第一步:选择环境】 echo 1. 测试环境 echo 2. UAT环境 echo. set /p env=选择环境: if "%env%"=="1" call :env1 if "%env%"=="2" call :env2 :env1 set host=168.168.168.168 set port=3308 set user=xxxx set pwd=xxxxxxx goto :setep2 :env2 set host=178.178.178.178 set port=8808 set user=xxxx set pwd=xxxxxxx goto :setep2 :setep2 echo. echo 【第二步:选择数据库】 echo 0. 手动设置数据库名 echo 1. dev-seal echo 2. dev-cert echo. set /p n=选择数据库: if "%n%"=="" cls&goto :setep2 if "%n%"=="0" call :goDB0 if "%n%"=="1" call :goDB1 pause goto :eof :goDB0 set /p manualDB=输入数据库名: set database=%manualDB% goto :confirm :goDB1 set database=dev_seal_database1 goto :confirm :confirm cls echo ═══════════════════════════════════════ echo 链接数据库 echo 目标: %host%:%port% echo 数据库: %database% echo 用户密码: %user% %pwd% echo ═══════════════════════════════════════ set /p lastConfirm=是否正确(y/n): if "%lastConfirm%"=="y" goto :connect if "%lastConfirm%"=="n" cls&goto :setep1 :connect start cmd /k "xmysql -h %host% -o %port% -u %user% -p %pwd% -d %database%" exit
到这一步的时候,已经实现了win系统下的用户需求了。但回首一看,测试小姐姐用的是苹果mac系统,辛辛苦苦编写的bat文件,在mac系统下,直接抓瞎。只能另辟蹊径
电三版:兼容win/mac系统(最终版)
win/mac一键启动脚本
考虑到mac系统不能兼容bat文件,改用shell
执行脚本能兼容win/mac
系统, 前提是win系统需要安装git bash之类的执行环境。基于公司使用git代码管理工具,刚好有条件满足。
代码撸起来,最终代码共有3个文件:
linkDB.sh 为最终执行脚本
mac.command 苹果mac系统下的启动脚本
win.bat 微软window系统下的启动脚本
mac.command
代码如下:
#!/bin/bash cd $(dirname $0) exec ./linkDB.sh
语法很简单,就是进入执行脚本的文件夹路径,然后执行linkDb.sh
文件
win.bat
代码如下:
@echo off set port=3000 # set /p port="请输入要关闭的端口,默认3000:" echo 开始搜索'netstat -ano^|findstr ":%port%" ' for /f "delims=" %%i in ( 'netstat -ano^|findstr :%port%' ) do set pid_line=%%i rem set pid=%pid_line:~-6% if "%pid_line%" == "" ( echo 没有找到! goto flag_exit ) else ( echo 已查找到: %pid_line% for %%a in (%pid_line%) do (set pid=%%a) ) echo 占用端口%port%的进程pid:%pid%;现在开始结束它 TASKKILL /PID %pid% /F :flag_exit start C:\Program" "Files\Git\git-bash.exe "linkDB.sh"
win系统下代码相对复杂一点,原因是第一次连接数据库,关闭窗口后3000端口可能会一直在占用,进程没有被结束。所以中间插入了结束3000端口进程的方法,然后启动git-bash
执行linkDb.sh
文件
linkDb.sh
代码如下:
#!/bin/bash # 环境配置,规则:自定义环境名,ip,port,用户,密码 evnList=( '测试环境,30.31.16.11,3308,user1,password1' 'UAT环境,30.31.16.12,3301,user2,password2' ) # 可配置常用数据库名 database1='dev-seal' database2='dev_cert' database3='uat_seal' devDBList=($database1 $database2 $database3) # 以下为主程序代码,无须修改 host='' port='' user='' pwd='' databaseCn='' database='' setep3() { clear echo ═════════════【连接数据库】════════════ echo 目标: $databaseCn echo 地址: $host:$port echo 库名: $database echo 用户: $user echo 密码: $pwd echo ═══════════════════════════════════════ echo read -p "正确(y), 错误重来(n):" lastConfirm if [[ $lastConfirm == 'y' ]]; then clear echo '开始连接数据库...' xmysql -h $host -o $port -u $user -p $pwd -d $database # exit else setep1; fi } setep2() { clear echo '【第二步:选择数据库】' echo ' ' 0. 手动输入 for i in "${!devDBList[@]}" do index=`expr $i + 1` echo ' ' $index. ${devDBList[i]} done echo read -p "选择数据库编号:" targetDB if [[ $targetDB -eq 0 ]]; then read -p "输入数据库名:" target if [[ $target == '' ]]; then setep2 else database=$target fi else database=${devDBList[$targetDB-1]} fi echo $database setep3; } setep1(){ clear echo '【第一步:选择环境】' for i in "${!evnList[@]}" do string=${evnList[$i]} stringList=(${string//,/ }) envName=${stringList[0]} index=`expr $i + 1` echo ' ' $index. ${envName} done echo read -p "选择环境:" env if [[ $env == '' ]]; then setep1 fi targetEnv=${evnList[$env-1]} params=(${targetEnv//,/ }) databaseCn=${params[0]} # 目标数据库名 host=${params[1]} # 数据库ip port=${params[2]} # 数据库端口 user=${params[3]} # 用户 pwd=${params[4]} # 密码 setep2; }; setep1;
最终版使用须知
============= 必读 =============
1. 安装node.js
下载地址: https://nodejs.org/zh-cn/
2. 安装xmysql
执行: npm install -g xmysql
参考地址:https://www.npmjs.com/package/xmysql#xjoin
========== mac 系统必读 ==========
1、首次使用,启动命令行
1.1、cd 进入当前文件夹
1.2、执行 chmod +x mac.command
1.3、执行 chmod +x linkDB.sh
2、后期使用,一键启动mac.command文件
========== win 系统必读 ==========
1. 首次使用,需要根据GIT BASH的安装位置,修改win.bat文件中的路径
2. 后期使用,一键启动win.bat文件
总结
经过这样折腾以后,基本满足傻瓜式启动方式,减少繁琐的操作,如有环境、数据库名的变更,只需要在linkDB.sh
中进行添加环境、添加数据库名即可,一次编写,多次使用。
以上就是Postman xmysql不切换环境缓存数据到本地的详细内容,更多关于Postman xmysql本地数据缓存的资料请关注脚本之家其它相关文章!