封装node脚本实现自动生成api配置文件

277 阅读2分钟

在前端开发中,通常需要进行接口对接,配置api接口文件及代码编写。当有大量的接口时,就要重复多次的做配置,影响开发效率。

而通过接口爬取的方式直接生成api.js文件可以大大提升开发效率。

主要使用node的request模块发起接口请求(fs模块进行写入操怍),具体实现如下:

创建mkApi.js

const fs = require('fs')
const path = require('path') // 解析需要遍历的文件夹
const jsonPath = path.resolve('./api.json') // 需要解析的api.json
const apiPath = '../../api' // 存放位置

// 调用读取qpi.josn文件方法
fileDisplay(jsonPath)

// json遍历 并分割成文件目录数组
function fileDisplay(jsonPath) {
  const content = fs.readFileSync(jsonPath, 'utf-8')
  const arr = JSON.parse(content)
  for (let i = 0; i < arr.length; i++) {
    const item = arr[i]
    const url = item.url
    const method = item.method || 'post'
    const dirs = url.split('/').filter((s) => {
      // 将url以'/'分隔成数组 并去除空数组
      return s && s.trim()
    })
    item.dirs = dirs
  }
  makeMultidir(arr) // 根据url创建目录
}

// 创建目录和js文件
function makeMultidir(arr) {
  arr.forEach((item) => {
    const dirs = item.dirs
    let cur = ''
    for (let i = 0; i < dirs.length; i++) {
      const el = dirs[i]
      const site = apiPath + '/' + el

      if (i >= dirs.length - 2) {
        // 倒数第二级为js
        // js文件
        if (i == dirs.length - 1) {
          let jsDir = apiPath + cur + '.js'
          console.log(jsDir, '写入api代码')
          // 最后一级为api,无需创建js,要写入api代码
          writeApi(jsDir, item)
        } else {
          let jsDir = apiPath + cur + '/' + el + '.js'
          cur = cur + '/' + el
          if (fs.existsSync(jsDir)) {
            console.log('js已存在')
          } else {
            console.log(jsDir, 'js不存在,创建js')
            // 创建js
            // const jsCont = '222'
            fs.writeFileSync(jsDir, '', function (err) {
              if (err) throw err
            })
          }
        }
      } else {
        cur = cur + '/' + el // 拼接当前遍历所在目录,用于判断js文件是否存在
        // 目录 'isFile(): ', statObx.isFile(), statObx.isDirectory()
        if (fs.existsSync(site) && fs.statSync(site).isDirectory()) {
          console.log('文件已存在')
        } else {
          console.log('文件不存在,创建目录')
          fs.mkdirSync(site)
        }
      }
    }
  })
}

// 写入api代码
function writeApi(jsDir, obj) {
  // 先判断api是否已经写入,避免重复写入
  const { url, method, dirs } = obj
  // 读取js文件内容
  const content = fs.readFileSync(jsDir, 'utf-8')
  const reg = /["|'](.*?)["|']/g
  const s = content
  const urlArr = []
  let hasApi = false
  // 获取api中双引号或单引号中的接口url
  while ((m = reg.exec(s))) {
    if (m[1].indexOf(dirs[dirs.length - 2]) != -1) {
      if (m[1] == url) {
        hasApi = true
        console.log('api配置已存在')
      }
    }
  } //eslint-disable-line
  if (!hasApi) {
    console.log('写入api配置代码')
    // 写入api配置代码
    let apiCon = `
export const ${dirs[dirs.length - 1]} = (data) => {
  return request({
    url: '${url}',
    method: '${method || 'post'}',
    ${method == 'get' ? 'params: data' : 'data'}
  })
}`
    const data = fs.readFileSync(jsDir, 'utf8').split('\n')
    data.splice(data.length - 1, 0, apiCon) // 向js文件的倒数第一行插入内容
    fs.writeFileSync(jsDir, data.join('\n'), 'utf8')
  }
}

创建api接口信息文件,用于测试

image.png

执行命令node mkApi.js即可根据json中的数据生成对应的api配置文件