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本地数据缓存的资料请关注脚本之家其它相关文章!
