node一些工具函数

1.之前写了axios发送http请求及上传下载功能,后面渐渐的需要很多功能,在这里整理一下我平常用到了,方便以后使用

const axios = require("axios");
const FS = require("fs");
const FilePath = require("path");
const UUID = require("uuid");
const json2csv = require("json2csv");
const json2xls = require("json2xls");
const csv2json = require("csvtojson");
const xlsx = require("node-xlsx");
const sDateTime = require("silly-datetime");
const readline = require("readline");
const MD5 = require("md5");
const crypto = require("crypto");

// 返回重定向url
async function redirectRequest(url) {
    let response = await axios.get(url);
    return response.request._redirectable._options.href;
}

// 获取一个uuid
function getUuid() {
    return UUID.v1().replace(/-/g, '');
}

// 判断是否为数组
function isArray(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
}

// json保存为csv文件
function jsonToCsv(json, savePath) {
    let csv = json2csv.parse(json);
    FS.writeFileSync(savePath, csv);
}

// json保存为xls文件
function jsonToXls(json, savePath) {
    let jsonArray = [];
    json.forEach(item => {
        jsonArray.push(item);
    })
    let xls = json2xls(jsonArray);
    FS.writeFileSync(savePath, xls, "binary");
}

// 读取csv文件成json
async function cvsToJson(filePath) {
    let jsonObjs = [];
    await csv2json().fromFile(filePath, "utf-8").then(jsonObj => {
        jsonObjs = jsonObj;
    });
    return jsonObjs;
}

// 追加到文件末尾
function toFile(fileName, content) {
    FS.appendFileSync(fileName, "\n" + content);
}

// 保存文件
function writeFile(fileName, content) {
    FS.writeFileSync(fileName, content);
}

// 逐行获取文件到数组
async function getFile(fileName) {
    let readStream = FS.createReadStream(fileName);
    let objReadline = readline.createInterface({
        input: readStream,
        terminal: true
    });
    let files = [];
    let i = 0;
    for await (const line of objReadline) {
        files[i++] = line;
    }
    return files;
}

// 写数据到xlsx
let data = [
	{
	     name: sheet.name,
	     data: dataRow
	 }
 ];
function writeXlsx(data, savePath) {
    let buffer = xlsx.build(data);
    FS.writeFileSync(savePath, buffer);
}

// 获取文件夹下文件夹列表
function getDirsInDir(dir) {
    return FS.readdirSync(dir);
}

// 获取文件夹下文件列表
function getFileInDir(dir) {
    return FS.readdirSync(dir);
}

// 链接下载文件
async function downloadLink(link) {
    let lastIndex = link.lastIndexOf("/");
    if (lastIndex === 0 || lastIndex === videoLink.length - 1) {
        console.log("this link is invalid, link is " + link);
        return;
    }
    let filename = videoLink.substring(lastIndex + 1);
    let fileStream = FS.createWriteStream("E:/file/" + filename);
    const response = await axios.get(link, {
        responseType: "stream"
    });
    await response.data.pipe(fileStream);
    fileStream.on("finish", function () {
        console.log(filename + "保存完成")
        fileStream.close();
    });
}

// 格式化时间
function formatDate(date, format) {
    if (format == null || format === "") {
        format = "YYYY-MM-DD HH:mm:ss"
    }
    return sDateTime.format(date, format);
}

// MD5加密
function md5(data) {
    return MD5(data);
}

// 睡眠ms
async function sleep(delay) {
    return new Promise(resolve => setTimeout(resolve, delay));
}

// 获取文件大小
function getFileSize(fileFullName) {
    return FS.statSync(fileFullName).size;
}
// 获取文件MD5
function getFileMd5(fileFullName) {
    let rs = FS.readFileSync(fileFullName);
    let hash = crypto.createHash("md5");
    hash.update(rs);
    return hash.digest("hex");
}

// 获取大文件MD5,分片计算
async function getBigFileMd5(fileFullName) {
    return new Promise((resolve, reject) => {
        const stream = FS.createReadStream(fileFullName);
        const hash = crypto.createHash('md5');
        stream.on('data', chunk => {
            hash.update(chunk);
        });
        stream.on('end', () => {
            const md5 = hash.digest('hex');
            resolve(md5)
        });
    });
}

// 获取文件片段
function getFileBytes(fileFullName, chunkSize, start, end) {
    return FS.createReadStream(fileFullName, {
            "start": start,
            "end": end
        }
    );
}

// 文件大小转换B->其它
function fileSizeTransfer(size) {
    if (size === 0) {
        return "0B";
    }
    let k = 1024;
    let sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
    let i = Math.floor(Math.log(size) / Math.log(k));
    return (size / Math.pow(k, i)).toPrecision(3) + sizes[i];
}

// 取随机数
function genRandom(n) {
    let chars = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
    let str = "";
    for (let i = 0; i < n; i++) {
        let id = Math.ceil(Math.random() * 61);
        str += chars[id];
    }
    return str;
}
// object 转 json
function obj2str(o) {
    let r = [];
    if (typeof o == "string") {
        return "\"" + o.replace(/([\'\"\\])/g, "\\$1").replace(/(\n)/g, "\\n").replace(/(\r)/g, "\\r").replace(/(\t)/g, "\\t") + "\"";
    }
    if (typeof o == "undefined") {
        return "undefined";
    }
    if (typeof o == "object") {
        if (o === null) return "null";
        else if (!o.sort) {
            for (let i in o)
                r.push("\"" + i + "\"" + ":" + obj2str(o[i]));
            r = "{" + r.join() + "}"
        } else {
            for (let i = 0; i < o.length; i++)
                r.push(obj2str(o[i]));
            r = "[" + r.join() + "]"
        }
        return r;
    }
    return o.toString();
}

module.exports = {
    redirectRequest,
    getUuid,
    jsonToCsv,
    jsonToXls,
    cvsToJson,
    getSheets,
    writeXlsx,
    toFile,
    writeFile,
    formatDate,
    getFile,
    getDirsInDir,
    md5,
    downloadLink,
    getFileInDir,
    sleep,
    getFileSize,
    getFileMd5,
    getBigFileMd5,
    getFileBytes,
    fileSizeTransfer,
    genRandom,
    obj2str
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值