生成地图数据工具

243 阅读2分钟

前言

公司原有项目需要部署X省,项目地图数据是直接放在前端资源(因为可能不能联网),需要去搞一份X省地图数据,手动的话工作量巨大所以自己写了个去阿里云 DataV - 数据可视化平台 (aliyun.com)获取数据生成json文件的脚本

知识点

fs.writeFile(file, data[, options], callback) 写文件

  • file: <string> | <Buffer> | <URL> | <integer>  文件名或文件描述符

  • data: <string> | <Buffer> | <TypedArray> | <Object> 

  • options: <Object> | <string> 

    • encoding <string> | <null> 默认值utf-8
    • mode: <integer> 默认值0o666
    • flag: <strgin> 请参阅对文件系统 flags 的支持。 默认值:  'w' 当 file 是文件名时,将数据异步地写入文件,如果文件已存在则替换该文件。 data 可以是字符串或缓冲区。

当 file 是文件描述符时,其行为类似于直接调用 fs.write()(推荐)。 请参阅以下有关使用文件描述符的说明。

如果 data 是缓冲区,则忽略 encoding 选项。

mode 选项仅影响新创建的文件。 有关详细信息,请参阅 fs.open()

如果 data 是普通的对象,则它必须具有自有的(不是继承的)toString 函数属性。

    import { writeFile } from 'fs'
    import { Buffer } from 'buffer'
    
    const data = new Uint8Array(Buffer.from('hello node'))
    writeFile('message.txt', data, err => {
        if (err) throw err
        console.log('The fiel has been saved!')
     })

fs.access(path[, mode], callback) 检测目录或文件权限

  • path:<string> | <Buffer> | <URL>
  • mode: <integer> 默认值fs.constants.F_OK
  • callback <Function>
    • err: <Error> 测试用户对 path 指定的文件或目录的权限。 mode 参数是可选的整数,指定要执行的可访问性检查。 查看文件访问的常量以获取可能的 mode 值。 可以创建由两个或多个值的按位或组成的掩码(例如 fs.constants.W_OK | fs.constants.R_OK

最后一个参数 callback 是回调函数,其使用一个可能的错误参数调用。 如果任何可访问性检查失败,则错误参数将是 Error 对象。 以下示例检查 package.json 是否存在,以及是否可读或可写

    import { access, constants } from 'fs'
    
    const file = 'package.json'
    
    // 检查当前目录是否存在该文件
    access(file, constans.F_OK, (err) => {
        console.log(`${file} ${err ? 'does not exist' : 'exists'}`)
    })
    
    // 检查文件是否可写
    access(file, constants.W_OK, (err) => {
        console.log(`${file} ${err ? 'is not writable' : 'is writabel'}`)
    })
    
    // 检查当前目录是否存在文件,是否可写
    access(file, constants.F_OK | constants.W_OK, (err) => {
        if (err) {
            console.error(`${file} ${err.code === 'ENOENT' ? 'does not exist' : 'is read-only'}`)
         } else {
             console.log(`${file} exists, and it is writable`)
         }
    })

在调用 fs.open()fs.readFile() 或 fs.writeFile() 之前,不要使用 fs.access() 检查文件的可访问性。 这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。 而是,用户代码应直接打开/读取/写入文件,并处理无法访问文件时引发的错误。

业务流程

  1. 检查生成的json文件存放目录是否存在,如果不存在创建目录
  2. 请求地图数据将数据写入文件存放在目录中
  3. 地图有下钻功能,因递归请求子级地图数据,存放到目录

部分代码

  // 创建之前先检测目录是否已经存在
 try {
   fs.accessSync(dirPath);
   fetchFn(config.rootCode, dirPath);
 } catch (error) {
   // 不存在则创建
   fs.mkdirSync(dirPath);
 }
   const { data } = await axios.get(url);
   fs.writeFile(`${dirPath}/${code}.json`, JSON.stringify(data), (err) => {
     if (err) {
       console.log(`${code}.json 文件写入失败: ${err}`);
     }
     console.log(`${code}.json 文件写入成功`);
   });

注意事项

  • 请求到的数据如不是string类型需转为string,项目中为Object,调用了JSON.stringify转为字符串

后续优化

加入终端询问,以终端答案为参数,请求对应地区数据,将生成文件保存到用户答案地址