Skip to content

服务管理平台Yapi安装及配置

907字约3分钟

2024-09-19

服务调测

内网部署

参考:https://hellosean1025.github.io/yapi/devops/index.html

异常解决:

  1. Error: getaddrinfo ENOTFOUND yapi.demo.qunar.com

​ 参考质料:https://github.com/YMFE/yapi/issues/2180

以pnpm安装为例,找到yapi-cli 安装的位置:/root/.local/share/pnpm/global/5/node_modules/yapi-cli/src/commands/server.js

修改server.js内如下:

// 将以下代码全部注释
if(config.company){
  try{
    // 将下面这行注释掉 然后保存退出
    // axios.post('http://yapi.demo.qunar.com/publicapi/statis', {company: config.company}).then(res=>{});
  }catch(e){}
}

修改同目录下install.js文件,内容如下:

try{
  await verifyConfig(config);
  let yapiPath = path.resolve(root, 'vendors');
  utils.log('开始下载平台文件压缩包...')
  await wget(yapiPath, v, 'github');  // 将这行代码替换为: await wget(yapiPath, v, "github"); 即指定传入的type类型
  utils.log('部署文件完成,正在安装依赖库...')
  shell.cd(yapiPath);
  await handleNpmInstall();
  utils.log('依赖库安装完成,正在初始化数据库mongodb...')
  await handleServerInstall();
  utils.log(`部署成功,请切换到部署目录,输入: "node vendors/server/app.js" 指令启动服务器, 然后在浏览器打开 ${domain} 访问`);
}catch(e){
  throw new Error(e.message)
}

// 淘宝进行地址已下线可以,修改为最新的地址:https://registry.npmmirror.com
// 若服务器已配置过npm源,可以删除。
function handleNpmInstall(){
  return new Promise(function(resolve, reject){
    // let child = shell.exec('pnpm install -q --production --registry https://registry.npm.taobao.org', {async: true, silent: true});
    let child = shell.exec('pnpm install -q --production', {async: true, silent: true});
    child.stdout.on('data', (data) => {
      console.log(` ${data}`);
    });

    child.stderr.on('data', (data) => {
      console.log(` ${data}`);
    });

    child.on('close', (code) => {
      resolve(true);
    });
  })
}

2.node-sass报错如下,先卸载在安装pnpm uninstall node-sass,然后重新安装和node环境匹配的版本

gyp verb check python checking for Python executable "python2" in the PATH
gyp verb `which` failed Error: not found: python2
gyp verb `which` failed     at getNotFoundError (F:\company_project\xiexin\trunk\app\xxsdapp\node_modules\which\which.js:13:12)
gyp verb `which` failed     at F (F:\company_project\xiexin\trunk\app\xxsdapp\node_modules\which\which.js:68:19)
gyp verb `which` failed     at E (F:\company_project\xiexin\trunk\app\xxsdapp\node_modules\which\which.js:80:29)

3.启动报错如下,安装extend模块,pnpm install extend

Error: Cannot find module 'extend'
Require stack:
- /var/lib/yapi/vendors/server/utils/mongoose-auto-increment.js
- /var/lib/yapi/vendors/server/models/base.js
- /var/lib/yapi/vendors/server/models/log.js
- /var/lib/yapi/vendors/server/utils/commons.js
- /var/lib/yapi/vendors/server/app.js

服务管理工具PM2

安装PM2工具

npm install pm2@latest -g

# 添加pm 服务
pm2 start -n yapi ./server/app.js

# 查看pm2 服务
pm2 list

# 停止服务
pm2 stop yapi

# 删除服务
pm2 delete yapi

root@iser:vendors# pm2 restart yapi
Use --update-env to update environment variables
[PM2] Applying action restartProcessId on app [yapi](ids: [ 1 ])
[PM2] [yapi](1) ✓
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
 id name mode status cpu memory
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
 1 yapi fork 1 online 0% 20.7mb
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘

自动鉴权

方案一:插件方式 yapi-plugin-interface-oauth2-token

​ yapi有自动鉴权插件,不过很难安装成功,参考资料

方案二:通过前置和后置脚本实现

打开 设置-> 请求配置 添加Pre-request Script 和 Pre-response Script 处理请求数据。参考示例:

Pre-request Script(请求参数处理脚本):

console.log("*****************************Pre-request*******************************")
console.log("context", context)
console.log("global", global)
var api_token = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKk1wsrn6mjD5v8CP5QunhxOx9Om7RXoZ5O3mE/MGKoqbt0M2bhWA3VyrhV2MwogOfEUvUWOgvgMxaylYvhaBE0CAwEAAQ=="
var {pathname, storage} = context
if(pathname=="/api/autoLogin" || pathname=="/api/login"){
    requestHeader.Authorization=""
    requestHeader['Api-Token']=""
    console.log("yapi delete Authorization success!")
} else if(pathname.startsWith("/api/audit")){
    requestHeader.Authorization=""
    requestHeader['Api-Token']=api_token
    console.log("yapi add audit token success!")
} else {
    //拦截请求,添加token
    requestHeader.Authorization=storage.getItem("AI-Authorization")
}

Pre-response Script(响应数据处理脚本)

注意:chrome下若api站点用的域名和rest服务域名不一致下面代码进行二次请求时报跨域问题。解决方案如下:

方案一:通过IP地址访问yapi进行服务调试

方案二:修改chrome隐私策略chrome://flags/#block-insecure-private-network-requests 将其disabled

console.log("*******************************Pre-response*****************************")
console.log(context)

var {href, pathname, responseData, storage, utils} = context
var login_url = href.replace(pathname, "/api/login") 
var login_param = {username:'yapi',password:'111111'}
if(responseData.code == 401){
    utils.axios.post(login_url, login_param).then(d =>{
        // 登录成功刷新token
        if(d.data && d.data.code === 200){
            storage.setItem("AI-Authorization", d.data.token)
            console.log("yapi refresh Authorization success!")
        }
    })
}

陕ICP备2021014644号-1