node.js常用工具函数

node 中使用import export

只需把 js 文件后缀改成 .mjs 就能使用import export的写法。

1、测试某个路径下文件是否存在,不存在则创建目录
import fs from "fs";
/**
 * 测试某个路径下文件是否存在,不存在则创建目录
 * @param {*} src 源目录路径
 * @param {*} dst 目标目录路径
 * @param {*} callback 回调函数(源目录、目标目录路径会作为参数传入)
 */
export const exists = function (src, dst, callback) {
  fs.exists(dst, function (exists) {
    if (exists) {
      callback?.(src, dst);
    } else {
      fs.mkdir(dst, function () {
        //创建目录
        callback?.(src, dst);
      });
    }
  });
};
2、复制文件夹目录以及里面的文件。

使用场景:当下载接口内容存在固定文件,又存在部分文件是根据传参内容生成时,需要新增一个文件夹(文件夹名称可以加上时间戳来区分,防止同时点击下载时被覆盖),再将固定文件复制到新增文件夹下。然后将自定义文件写入新增文件夹内。最后下载。

import fs from "fs";
var stat = fs.stat;

/**
 * 复制目录下的内容
 * @param {*} src 源目录地址
 * @param {*} dst 拷贝到的位置
 */
export const copy = function (src, dst) {
  //读取目录
  fs.readdir(src, function (err, paths) {
    if (err) {
      throw err;
    }
    paths.forEach(function (path) {
      var _src = src + "/" + path;
      var _dst = dst + "/" + path;
      var readable;
      var writable;
      stat(_src, function (err, st) {
        if (err) {
          throw err;
        }
        if (st.isFile()) {
          readable = fs.createReadStream(_src); //创建读取流
          writable = fs.createWriteStream(_dst); //创建写入流
          readable.pipe(writable);
        } else if (st.isDirectory()) {
          exists(_src, _dst, copy);
        }
      });
    });
  });
};

使用:

import { exists, copy } from"./util.mjs";

exists("./sourcePath", "./targetPath", copy);

3、删除指定路径下的所有文件夹和文件
import fs from "fs";
export const rmFileAndDir = function (path) {
  const files = fs.readdirSync(path);
  files.forEach((file) => {
    const filePath = `${path}/${file}`;
    const stats = fs.statSync(filePath);
    if (stats.isDirectory()) {
      rmFileAndDir(filePath);
    } else {
      fs.unlinkSync(filePath);
      // console.log(`删除${file}文件成功`);
    }
  });
  fs.rmdirSync(path);
};
4、压缩文件

使用场景:下载接口,下载多个文件时。

用到archiver包,其中 zlib 参数有很多,这里列出两个解释。

level:压缩级别,值在0-9之间,1速度最快,9压缩比最大.

memLevel:指定多少内存应该内部压缩状态进行分配,1是最小内存速度慢压缩比低。9是最大内存,速度最快。默认值为8。

import archiver from "archiver";

function compressFolder(sourcePath, zipFilePath) {
  return new Promise((resolve, reject) => {
    //压缩文件start
    const archiveObject = archiver("zip", {
      zlib: { level: 9 }, // 设置压缩级别
    });
    const output = fs.createWriteStream(zipFilePath); // 先创建一个可写流,用于传入压缩包数据
    archiveObject.pipe(output); // 使用pipe将两个流连接,开始写压缩包数据
    archiveObject.directory(sourcePath, false); // 第一个参数是源目录路径,第二个参数是压缩目录路径
    output.on("close", async function () {
      console.log("close");
      resolve();
    });
    // 使用finalize进行压缩
    // “close”、“end”或“finish”可能在调用此方法后立即被触发,因此请预先向它们注册
    archiveObject.finalize();
    //压缩文件end
  });
}
5、睡眠
// 睡眠
export function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

使用配合 async 、await

// 我的函数
async function downloadPage(req, response, pageFile, pageName = "index") {
  //...
  await sleep(50); //这里要等一下再继续,不然下载下来的文件会出现损坏情况
 //...
}
6、数组格式转树状结构

利用对象属性唯一特性,以下为高效写法。

/**
 * 数组格式转树状结构
 * @param   {array}     array
 * @param   {String}    id
 * @param   {String}    pid
 * @param   {String}    children
 * @return  {Array}
 */
export function arrayToTree(
  array,
  id = "id",
  pid = "pid",
  children = "children"
) {
  let data = JSON.parse(JSON.stringify(array));
  let result = [];
  let hash = {};
  data.forEach((item, index) => {
    hash[data[index][id]] = data[index];
  });

  data.forEach((item) => {
    let hashVP = hash[item[pid]];
    if (hashVP) {
      !hashVP[children] && (hashVP[children] = []);
      hashVP[children].push(item);
    } else {
      result.push(item);
    }
  });
  return result;
}

欢迎评论交流

❤️ 更多前端知识欢迎关注公众号交流

在这里插入图片描述

❤️ 这里有你想知道的web前端知识

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值