Node.js设置定时任务之node-schedule模块的使用详解
引言
在Node.js开发中,我们经常需要设置定时任务,来执行一些周期性的任务,比如定时发送邮件、数据备份、定时爬取数据等。node-schedule是一个可以非常方便地设置定时任务的模块,本篇文章就来详细讲解其使用方法。
安装
在开始使用node-schedule模块前,我们需要先安装它。可以使用以下命令进行安装:
npm install node-schedule
使用方法
基本用法
我们可以通过调用node-schedule的scheduleJob()
方法来设置一个定时任务,该函数需要传入两个参数,分别是时间表达式和回调函数。
时间表达式(Schedule Rule)可以是各种类型的字符串,用来表示我们希望定时任务在什么时间执行。时间表达式的语法非常灵活,我们下面会举例说明。
回调函数是我们希望在定时任务执行时执行的函数,它接收一个参数,表示该定时任务的具体内容。
以下是一个设置定时任务的基本范例:
const schedule = require('node-schedule');
// 设置定时任务,每分钟的30秒执行
schedule.scheduleJob('30 * * * * *', function(){
console.log('定时任务执行了!');
});
在上面的例子中,我们使用scheduleJob()
方法设置了一个定时任务,该任务将在每分钟的30秒时执行。定时任务的具体内容就是输出一句话到控制台。
时间表达式语法
上面的例子中我们使用了一个非常简单的时间表达式 30 * * * * *
,它表示“每分钟的30秒执行”。那么,时间表达式的具体语法是怎么样的呢?
时间表达式是由6个通配符组成的,表示的是任务执行的时间。这6个通配符分别代表“秒”、“分”、“时”、“日”、“月”和“星期”,其中星期是可选的。这些通配符可以是数字、星号、减号、逗号、斜杆等符号。
接下来我们逐个讲解这些通配符:
通配符 | 含义 | 可选值 |
---|---|---|
* |
匹配任意值 | 0-59(秒)、0-23(时)、1-31(日)、1-12(月)、0-7(星期) |
5,10,15 |
匹配指定的值 | 0-59(秒)、0-23(时)、1-31(日)、1-12(月)、0-7(星期) |
3-7 |
匹配范围内的值 | 0-59(秒)、0-23(时)、1-31(日)、1-12(月)、0-7(星期) |
*/5 |
匹配每隔多少秒/分/小时/天执行 | 0-59(秒)、0-23(时)、1-31(日)、1-12(月)、0-7(星期) |
0 0 3 * * * |
每天凌晨3点 | |
0 30 4 * * * |
每天4点半 | |
0 30 10 * * 1-5 |
周一至周五10点半 | |
0 30 10 * * 1,3,5 |
周一、周三、周五10点半 |
另外,时间表达式也支持更高级的设置,如使用ISO 8601扩展格式、 Cron表达式等。
其他API
在node-schedule中,除了scheduleJob()
方法外,还有一些其他常用的API,主要包括以下两类:
取消定时任务
如果我们在设置定时任务的时候希望随时取消掉该任务,我们可以使用cancel()
方法。该方法接收一个参数,即我们之前设置时返回的Job对象,表示取消掉该Job对象所对应的任务。以下是一个简单的取消任务的例子:
const schedule = require('node-schedule');
// 设置定时任务,每分钟的30秒执行
const job = schedule.scheduleJob('30 * * * * *', function(){
console.log('定时任务执行了!');
});
// 取消定时任务
job.cancel();
执行一次性任务
如果我们只需要执行一次性的任务,可以使用scheduleJob()
方法的返回值来实现。返回值是一个表示该任务的Job对象,我们可以直接调用它的invoke()
方法来执行该任务。以下是一个简单的执行一次性任务的例子:
const schedule = require('node-schedule');
// 设置定时任务,30秒后执行
const job = schedule.scheduleJob(Date.now() + 30000, function(){
console.log('一次性定时任务执行了!');
});
// 执行一次性任务
job.invoke();
示例说明
示例1
以下是一个实际应用的示例,我们定时执行一个爬虫程序,每隔5分钟爬取一次指定的网站内容,并将结果保存到本地:
const schedule = require('node-schedule');
const request = require('request');
const fs = require('fs');
// 设置定时任务,每隔5分钟执行
schedule.scheduleJob('*/5 * * * *', function(){
console.log('开始执行爬虫程序...');
request('https://www.***.com/article', function(error, response, body) {
if (!error && response.statusCode == 200) {
// 将爬虫结果写入本地文件
fs.writeFileSync('result.txt', body, 'utf-8');
console.log('爬取成功!');
} else {
console.log('爬取失败!' + error);
}
});
})
在上面的例子中,我们在每隔5分钟的时候定时执行一个爬虫程序,该程序将会爬取一个指定的网站的内容,并将结果保存到本地文件中。
示例2
以下是另一个实际应用的示例,借助定时任务功能,我们在特定的时间段向用户发送提醒:
const schedule = require('node-schedule');
const nodemailer = require('nodemailer');
// 设置定时任务,每天9点和15点发送邮件提醒
schedule.scheduleJob('0 0 9,15 * * *', function(){
console.log('开始发送提醒邮件...');
// 创建邮件发送的Transport对象
const transporter = nodemailer.createTransport({
service: 'smtp.163.com',
port: 465,
secure: true,
auth: {
user: '******@163.com',
pass: '******'
}
});
// 邮件发送的配置信息
const mailOptions = {
from: '发件人姓名 <******@163.com>',
to: '收件人姓名 <******@163.com>',
subject: '提醒邮件',
text: '请注意查收邮件,防止错过重要事情!'
};
// 发送邮件
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log(error);
} else {
console.log('邮件发送成功!');
}
});
})
在上面的例子中,我们设置了一个定时任务,该任务将会在每天的9点和15点时执行,发送一封提醒邮件给用户。可以看到,node-schedule模块非常方便地帮助我们实现了这一功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js设置定时任务之node-schedule模块的使用详解 - Python技术站