当前位置: 首页 > article >正文

NodeJS接口

一、模块导入
// ---------------------------<<导入模块>>---------------------------
const fs = require("fs");
const os = require("os");
const path = require("path");
const cors = require("cors");
const archiver = require("archiver");
const AdmZip = require('adm-zip');
const multer = require('multer');
const express = require("express");


// ---------------------------<<模块应用>>---------------------------
// 应用Express
const app = express();
// 设置multer存储
const upload = multer({ storage: multer.memoryStorage() });
// 设置跨域(*)
app.use(cors());

二、逻辑处理
// ---------------------------<<逻辑处理>>---------------------------
// 查找最新子文件夹
function findNewDir(dir, time) {
  const dirList = fs.readdirSync(dir);

  let newDir = null,
    lastTime = 0;

  for (let i = 0; i < dirList.length; i++) {
    var fullPath = path.join(dir, dirList[i]);
    const stat = fs.statSync(fullPath);

    if (stat.isDirectory()) {
      if (stat.birthtimeMs > lastTime) {
        lastTime = stat.birthtimeMs;
        newDir = fullPath;
      }
    }
  }

  if (lastTime > time) {
    return newDir;
  } else {
    return "";
  }
}

// 递归查找子文件夹下所有文件
function redFiles(dir, fileList = []) {
  const files = fs.readdirSync(dir);
  for (let i = 0; i < files.length; i++) {
    var fullPath = path.join(dir, files[i]);
    const stat = fs.statSync(fullPath);

    if (stat.isDirectory()) {
      redFiles(fullPath, fileList);
    } else {
      fileList.push(fullPath);
    }
  }

  return fileList;
}

// 获取并压缩文件
function findFile(files, res) {
  // 如果没有文件,则直接返回错误
  if (!files || files.length === 0) {
    return res.status(400).send('No files to zip.');
  }

  try {
    // 设置压缩级别
    const archive = archiver("zip", {
      zlib: { level: 9 },
    });

    // 注册 error 事件监听器,在 finalize() 之前进行
    archive.on("error", (err) => {
      console.error("创建 ZIP 文件时出错:", err);
      res.status(500).send("服务器错误");
    });

    // 添加文件到归档
    for (let i = 0; i < files.length; i++) {
      archive.file(files[i], { name: path.basename(files[i]) });
    }

    // 最终化归档
    archive.finalize();

    // 设定默认文件名
    res.attachment("files.zip");

    // 将归档流管道到响应对象
    archive.pipe(res);

  } catch (error) {
    console.error("处理请求时出错:", error);
    res.status(500).send("服务器错误");
  }
}

// 过滤xml文件
function findXml(newDir) {
  // 递归获取所有文件路径
  const result = redFiles(newDir, []);

  // 筛选掉所有非.xml文件
  let temp = [];
  const regex = /\.xml$/;
  for (let i = 0; i < result.length; i++) {
    // 筛选.xml文件
    if (regex.test(result[i])) {
      temp.push(result[i]);
    }
  }
  return temp
}

// 解压文件
function unzipFile(file, filename, res) {
  // *****注意:windows和linux的路径不一样,找一个固定路径处理文件解压和打包*****
  let directory = "/usr/local/src/temp"

  try {
    const zip = new AdmZip(file);
    zip.extractAllTo(directory, true); // true 表示覆盖已存在的文件
    console.log("")
    console.log('Files extracted successfully.');

    // 过滤所有xml文件
    let temp = findXml(directory)

    // 读取文件并压缩,返回结果给前端
    if (temp.length == 0) {
      return res.status(400).send('No files to zip.');
    } else {
      findFile(temp, res);
    }
  } catch (err) {
    console.error("处理请求时出错:", err);
    res.status(500).send("服务器错误");
  }
}

三、接口路由
// ---------------------------<<接口路由>>---------------------------
// 抓取文件
app.get("/getFiles", (req, res) => {
  // 获取接口参数
  let { startTime } = req.query;

  // *****注意:定义需要抓取的路径,也可以从接口传参*****
  let dir = '/usr/local/src'

  if (fs.existsSync(dir)) {

    // 获取最新文件夹并且时间小于开始时间
    let newDir = findNewDir(dir, startTime);

    if (newDir) {
      let temp = findXml(newDir)
      // 读取文件并压缩,返回结果给前端
      if (temp.length == 0) {
        return res.status(400).send('No files to zip.');
      } else {
        findFile(temp, res);
      }
    } else {//未找到文件夹
      return res.status(400).send('No search directory');
    }
  } else {
    res.send("")
  }
})

// 获取本机IP地址
app.get("/getLocalIp", (req, res) => {
  const interfaces = os.networkInterfaces();

  let ip = ''

  for (let key in interfaces) {
    for (let i = 0; i < interfaces[key].length; i++) {
      if (interfaces[key][i].family == 'IPv4' && !interfaces[key][i].internal) {
        ip = interfaces[key][i].address
      }
    }
  }

  if (ip) {
    return res.send({
      code: 1000,
      ip,
      msg: '请求成功'
    })
  } else {
    return res.send({
      code: 1001,
      ip,
      msg: '未找到IP'
    })
  }
});

// 重新打压缩包
app.post("/repackage", upload.single('file'), (req, res) => {
  if (!req.file) {
    return res.status(400).send('No file uploaded.');
  }

  unzipFile(req.file.buffer, res)
})

四、服务监听
// ---------------------------<<服务监听>>---------------------------
// 服务监端口
app.listen(9002, () => {
  console.log("服务已经启动,监听端口9002");
});

原文地址:https://blog.csdn.net/StupidlyGrass/article/details/146254923
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/585706.html

相关文章:

  • DB-GPT-0.7版本win11安装,最新版本,安装方式变更了
  • Microsoft Excel 2024 LTSC mac v16.95 表格处理软件 支持M、Intel芯片
  • Java入职篇(1)——心态篇
  • jvm汇总
  • 基于相量测量单元(PMU)的电力系统故障分析MATLAB仿真
  • linux常用基本指令汇总
  • 散货拼柜业务痛点有哪些?货代公司如何通过散拼系统提高效率?
  • ABC 375
  • Mybaties批量操作
  • SAP BC 记一次 DBCO 链接ORACLE DBCC 连接测试突然失败的问题
  • Python中将Markdown文件转换为Word
  • 【Linux】从互斥原理到C++ RAII封装实践
  • Web安全:保护您的网站免受网络威胁
  • Microsoft Outlook 2024 LTSC for Mac v16.95 电子邮件和日历 支持M、Intel芯片
  • Peach配置文件中<Agent>模块的作用及参数解析
  • SpringBoot调用华为云短信实现发短信功能
  • 如何把绿色可执行应用程序添加到Ubuntu的收藏夹Dock中
  • 【Azure 架构师学习笔记】- Azure Databricks (20) --Delta Live Table 建议
  • Markdown Poster – 免费Markdown转图片工具|优雅图文海报制作与社交媒体分享
  • Vue 中如何使用 slot 和 scoped slot?