亲宝软件园·资讯

展开

Postman xmysql不切换环境缓存数据到本地

River_WJ 人气:0

背景

公司内部有个标准产品(对外开发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中进行添加环境、添加数据库名即可,一次编写,多次使用。

加载全部内容

相关教程
猜你喜欢
用户评论