11个高效JavaScript自动化脚本实战:文件管理、邮件通知与数据处理的终极解决方案
覆盖文件管理、邮件调度、PDF处理等核心场景,通过模块化代码+原理剖析+安全实践,助你构建自动化工作流。所有代码均通过Node 18 LTS验证,附。:你在自动化实践中遇到过哪些"坑"?欢迎分享你的踩坑经验与解决方案!
·
摘要
本文精选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
- 推荐阅读:
讨论话题:你在自动化实践中遇到过哪些"坑"?欢迎分享你的踩坑经验与解决方案!
更多推荐


所有评论(0)