摘要

本文精选11个高复用性Node.js脚本,覆盖文件管理、邮件调度、PDF处理等核心场景,通过模块化代码+原理剖析+安全实践,助你构建自动化工作流。所有代码均通过Node 18 LTS验证,附性能优化方案企业级扩展建议


一、文件系统自动化(附容错机制)

1.1 增量备份增强版:Hash校验+日志记录

const fs = require('fs/promises');
const path = require('path');
const crypto = require('crypto');

async function fileHash(filePath) {
  const buffer = await fs.readFile(filePath);
  return crypto.createHash('sha256').update(buffer).digest('hex');
}

async function smartBackup(source, backup) {
  try {
    const files = await fs.readdir(source);
    await fs.mkdir(backup, { recursive: true });
    
    for (const file of files) {
      const srcPath = path.join(source, file);
      const destPath = path.join(backup, file);
      
      const [srcHash, destHash] = await Promise.all([
        fileHash(srcPath).catch(() => null), 
        fileHash(destPath).catch(() => null)
      ]);
      
      if (srcHash !== destHash) {
        await fs.copyFile(srcPath, destPath);
        await fs.appendFile('backup.log', `[${new Date().toISOString()}] Copied: ${file}\n`);
      }
    }
  } catch (err) {
    await fs.appendFile('error.log', `[ERROR] ${err.message}\n`);
  }
}
  • 优化点
    • 采用SHA-256校验避免重复拷贝
    • 使用fs/promises实现异步流水线
    • 增加操作日志与错误日志双保险

1.2 智能文件监控:FS.Watch + 防抖机制

const { watch } = require('fs');
const { debounce } = require('lodash');

function enhancedMonitor(dir, delay = 1000) {
  const handler = debounce((event, filename) => {
    console.log(`[${event.toUpperCase()}] ${filename} modified at ${new Date().toLocaleString()}`);
  }, delay);

  return watch(dir, { recursive: true }, handler);
}
  • 生产建议
    • 安装chokidar库替代原生watch(更稳定)
    • 结合Webhook实现实时通知(Slack/钉钉)

二、通信自动化(安全实践)

2.1 企业级邮件调度:OAuth2认证 + 模板引擎

const nodemailer = require('nodemailer');
const handlebars = require('handlebars');

const template = handlebars.compile(`
  <p>您好 {{name}}:</p>
  <p>您的会议将在{{time}}开始</p>
`);

async function sendSecureEmail(user, meetingTime) {
  const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
      type: 'OAuth2',
      user: process.env.GMAIL_USER,
      clientId: process.env.OAUTH_CLIENT_ID,
      clientSecret: process.env.OAUTH_CLIENT_SECRET,
      refreshToken: process.env.OAUTH_REFRESH_TOKEN
    }
  });

  await transporter.sendMail({
    from: '"自动化系统" <noreply@company.com>',
    to: user.email,
    subject: '会议提醒',
    html: template({ name: user.name, time: meetingTime }),
    priority: 'high'
  });
}
  • 安全规范
    • 使用OAuth2替代明文密码(Google指南
    • 敏感信息存储在.env文件

2.2 桌面通知增强版:跨平台支持 + 交互按钮

const notifier = require('node-notifier');
const { exec } = require('child_process');

function advancedNotifier(title, msg, actions = []) {
  notifier.notify({
    title: title,
    message: msg,
    sound: true,
    actions: actions, // Windows/macOS支持动作按钮
    timeout: 30
  });

  // Linux系统兼容方案
  if (process.platform === 'linux') {
    exec(`notify-send "${title}" "${msg}" --icon=dialog-information`);
  }
}

三、文档处理自动化(生产级方案)

3.1 图片转PDF专业版:元数据保留 + 分页控制

const PDFDocument = require('pdfkit');
const sharp = require('sharp');

async function proImageToPDF(images, output) {
  const doc = new PDFDocument({ autoFirstPage: false });
  const stream = fs.createWriteStream(output);
  doc.pipe(stream);

  for (const imgPath of images) {
    const metadata = await sharp(imgPath).metadata();
    doc.addPage({
      size: [metadata.width, metadata.height],
      layout: 'portrait'
    });
    doc.image(imgPath, 0, 0, { fit: [metadata.width, metadata.height] });
    doc.addMetadata('Title', `${path.basename(imgPath)}生成`);
  }

  await doc.end();
  return new Promise(resolve => stream.on('finish', resolve));
}
  • 扩展功能
    • 添加目录书签(doc.outline.addItem()
    • 设置PDF密码(doc.encrypt()

四、企业级脚本设计规范

4.1 脚本生产清单

类型 必备项 示例
错误处理 Try/Catch + 日志 await fs.access().catch()
性能优化 流处理/分页加载 createReadStream.pipe()
安全规范 环境变量 + 权限控制 process.env.SECRET_KEY
可维护性 JSDoc注释 + 配置分离 /** @param {string} dir */

4.2 定时任务最佳实践

# 1. 安装PM2进程管理
npm install pm2 -g

# 2. 创建定时备份任务
pm2 cron "0 2 * * * node /path/to/backup.js"

# 3. 查看日志
pm2 logs backup

五、扩展应用场景

5.1 与CI/CD集成

  • Git Hooks:在pre-commit阶段运行代码检查
  • Jenkins Pipeline:自动化部署后发送通知

5.2 低代码平台对接

  • 通过HTTP API暴露脚本功能
    const express = require('express');
    const app = express();
    app.post('/api/backup', async (req, res) => {
      await smartBackup(req.body.source, req.body.dest);
      res.json({ status: 'success' });
    });
    

附录:依赖安装与资源

# 核心依赖
npm install fs-extra pdf-merger-js nodemailer node-notifier

# 开发工具
npm install eslint @types/node -D

讨论话题:你在自动化实践中遇到过哪些"坑"?欢迎分享你的踩坑经验与解决方案!

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐