前言
公司原有项目需要部署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-8mode: <integer>默认值0o666flag: <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_OKcallback <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() 检查文件的可访问性。 这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。 而是,用户代码应直接打开/读取/写入文件,并处理无法访问文件时引发的错误。
业务流程
- 检查生成的json文件存放目录是否存在,如果不存在创建目录
- 请求地图数据将数据写入文件存放在目录中
- 地图有下钻功能,因递归请求子级地图数据,存放到目录
部分代码
// 创建之前先检测目录是否已经存在
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转为字符串
后续优化
加入终端询问,以终端答案为参数,请求对应地区数据,将生成文件保存到用户答案地址