寻求Node.js中定时每日执行任务及发送通知的NPM模块
Node.js 定时任务与通知解决方案
嘿,针对你Node.js应用的两个需求,我给你整理了业内常用且稳定的实现方案,分模块来讲:
一、每日重复执行任务的定时模块推荐
1. node-schedule(最灵活的选择)
我平时做项目时最常用这个模块,它支持基于日期的精确调度,完全能满足"指定时间每日重复"的需求,而且语法直观,支持本地时间配置。
安装命令:
npm install node-schedule
基础示例(每日本地时间9点执行任务):
const schedule = require('node-schedule'); // 定义每日9点的规则:分钟0,小时9,其他字段默认通配(即每天) const job = schedule.scheduleJob('0 9 * * *', function() { console.log('每日9点的定时任务执行了!'); // 这里可以放你要执行的业务逻辑,比如调用通知函数 });
如果需要更复杂的规则,比如每周一到周五的9点,只需要调整cron表达式:0 9 * * 1-5
2. node-cron(轻量简洁的替代)
如果你的需求相对简单,node-cron是个更轻量的选择,它基于标准cron语法,学习成本低。
安装命令:
npm install node-cron
示例代码:
const cron = require('node-cron'); // 每日本地时间9点执行 cron.schedule('0 9 * * *', () => { console.log('每日9点的定时任务执行了!'); }, { scheduled: true, timezone: 'Asia/Shanghai' // 指定本地时区,确保时间准确 });
二、本地时间9点发送邮件+短信通知
结合上面的定时模块,我们可以在任务触发时调用邮件和短信模块发送通知:
1. 邮件通知:nodemailer
这是Node.js生态中最成熟的邮件发送库,支持QQ邮箱、Gmail、企业邮箱等多种服务商。
安装命令:
npm install nodemailer
邮件发送示例(结合node-schedule):
const schedule = require('node-schedule'); const nodemailer = require('nodemailer'); // 配置邮件传输器(以QQ邮箱为例) const transporter = nodemailer.createTransport({ host: 'smtp.qq.com', port: 465, secure: true, auth: { user: 'your-qq-email@qq.com', pass: 'your-email-authorization-code' // 注意是邮箱授权码,不是登录密码 } }); // 发送邮件函数 const sendEmail = async () => { try { await transporter.sendMail({ from: '"你的应用" <your-qq-email@qq.com>', to: 'recipient@example.com', subject: '每日定时通知', text: '这是每日上午9点的邮件通知!', html: '<b>这是每日上午9点的邮件通知!</b>' }); console.log('邮件发送成功'); } catch (error) { console.error('邮件发送失败:', error); } }; // 定时触发邮件发送 schedule.scheduleJob('0 9 * * *', sendEmail);
2. 短信通知:twilio(通用国际服务商)
如果需要发送短信,Twilio是个靠谱的选择,支持全球多数地区。国内用户也可以选择阿里云短信、腾讯云短信等服务商,用法类似,这里以Twilio为例:
安装命令:
npm install twilio
短信发送示例(结合定时任务):
const schedule = require('node-schedule'); const twilio = require('twilio'); // 初始化Twilio客户端(需在Twilio官网获取账号SID和Auth Token) const client = twilio('your-twilio-account-sid', 'your-twilio-auth-token'); const sendSMS = async () => { try { await client.messages.create({ body: '这是每日上午9点的短信通知!', from: 'your-twilio-phone-number', to: 'recipient-phone-number' // 格式如+8613xxxxxxxxx }); console.log('短信发送成功'); } catch (error) { console.error('短信发送失败:', error); } }; // 定时触发短信发送 schedule.scheduleJob('0 9 * * *', sendSMS);
3. 整合邮件+短信的完整示例
把两个通知逻辑合并到一个定时任务里:
const schedule = require('node-schedule'); const nodemailer = require('nodemailer'); const twilio = require('twilio'); // 初始化邮件传输器 const emailTransporter = nodemailer.createTransport({ // 你的邮件配置 }); // 初始化Twilio客户端 const smsClient = twilio('your-twilio-account-sid', 'your-twilio-auth-token'); // 统一通知函数 const sendDailyNotifications = async () => { try { // 发送邮件 await emailTransporter.sendMail({ // 邮件内容配置 }); // 发送短信 await smsClient.messages.create({ // 短信内容配置 }); console.log('每日通知发送完成'); } catch (error) { console.error('通知发送失败:', error); } }; // 本地时间每日9点执行 schedule.scheduleJob('0 9 * * *', sendDailyNotifications);
注意事项
- 时区配置:如果服务器在境外,务必在定时任务中指定本地时区(如
timezone: 'Asia/Shanghai'),避免时间偏差。 - 服务稳定性:建议配合PM2等进程管理工具,确保应用意外退出后自动重启,定时任务不会中断。
- 权限配置:邮件和短信服务商需要正确配置授权信息(如邮箱授权码、Twilio的SID和Token),否则会发送失败。
内容的提问来源于stack exchange,提问作者Vithal Reddy




