在预定时间致电 API
Call API at scheduled time
我正试图 运行 在预定时间拨打 API 电话。我通过网站进行了研究,发现了这个来自 npmjs 的名为 node-schedule 的包。通过在需要的时间调用代码,这按预期工作。我遇到的问题是:
假设我有一个时间列表,例如:["10:00","11:00","13:00"]
一旦我启动服务器,它就会在需要的时间执行。但是,如果我想动态更改时间列表怎么办?
正是我想要做的:
- 调用 API 并从数据库中获取时间
- 为每个时间设置 cron-schedule。
- 向数据库动态添加新时间
我想要的:将这个新添加的时间动态添加到cron-schedule
index.js
const express = require('express');
const schedule = require('node-schedule');
const app = express();
const port = 5000;
var date = new Date(2019, 5, 04, 14, 05, 20);// API call here
var j = schedule.scheduleJob(date, function(){
console.log('The world is going to end today.');
});
app.get('/test', (req, res) => {
var date = new Date(2019, 5, 04, 14, 11, 0); // Will call API here
var q = schedule.scheduleJob(date, function(){
console.log('Hurray!!');
});
res.send('hello there');
});
app.listen(port, () => console.log(`Example app listening on port ${port}!`));
上面写的代码是我所拥有的,而且它很乱。我要表达的意思是,当 运行 调用 index.js
文件 API 并执行 cron-schedule
时。现在,如果有一些新值添加到数据库中,我想重新运行 this.
Re运行ning index.js
是我的另一个选择,但我认为这不是正确的做法。我想到的下一个选项是调用上面提到的 /test
的另一个端点,最终将再次 运行 cron。
请让我知道一些建议或某种解决方案,以便我可以纠正错误。
使用这段代码我认为你可以做你想做的事,尽管你必须根据你的需要调整它来定义将执行任务的函数,或者如果你需要指定它们将被执行的时间以另一种方式(例如,设置一周中的特定日期)。
var times = [];
var tasks = [];
function addTask(time, fn) {
var timeArr = time.split(':');
var cronString = timeArr[1] + ' ' + timeArr[0] + ' * * *';
// according to https://github.com/node-schedule/node-schedule#cron-style-scheduling
var newTask = schedule.scheduleJob(cronString, fn);
// check if there was a task defined for this time and overwrite it
// this code would not allow inserting two tasks that are executed at the same time
var idx = times.indexOf(time);
if (idx > -1) tasks[idx] = newTask;
else {
times.push(time);
tasks.push(newTask);
}
}
function cancelTask(time) {
// https://github.com/node-schedule/node-schedule#jobcancelreschedule
var idx = times.indexOf(time);
if (idx > -1) {
tasks[idx].cancel();
tasks.splice(idx, 1);
times.splice(idx, 1);
}
}
function init(tasks) {
for (var i in tasks){
addTask(i, tasks[i]);
}
}
init({
"10:00": function(){ console.log("It's 10:00"); },
"11:00": function(){ console.log("It's 11:00"); },
"13:00": function(){ console.log("It's 13:00"); }
});
app.post('/addTask', (req, res) => {
if (!req.body.time.match(/^(0[0-9]|1[0-9]|2[0-3]|[0-9]):[0-5][0-9]$/)) {
// regex from
return res.status(400).json({'success': false, 'code': 'ERR_TIME'});
}
function fn() {
// I suppose you will not use this feature just to do console.logs
// and not sure how you plan to do the logic to create new tasks
console.log("It's " + req.body.time);
}
addTask(req.body.time, fn);
res.status(200).json({'success': true});
});
我正试图 运行 在预定时间拨打 API 电话。我通过网站进行了研究,发现了这个来自 npmjs 的名为 node-schedule 的包。通过在需要的时间调用代码,这按预期工作。我遇到的问题是:
假设我有一个时间列表,例如:["10:00","11:00","13:00"]
一旦我启动服务器,它就会在需要的时间执行。但是,如果我想动态更改时间列表怎么办?
正是我想要做的:
- 调用 API 并从数据库中获取时间
- 为每个时间设置 cron-schedule。
- 向数据库动态添加新时间
我想要的:将这个新添加的时间动态添加到cron-schedule
index.js
const express = require('express');
const schedule = require('node-schedule');
const app = express();
const port = 5000;
var date = new Date(2019, 5, 04, 14, 05, 20);// API call here
var j = schedule.scheduleJob(date, function(){
console.log('The world is going to end today.');
});
app.get('/test', (req, res) => {
var date = new Date(2019, 5, 04, 14, 11, 0); // Will call API here
var q = schedule.scheduleJob(date, function(){
console.log('Hurray!!');
});
res.send('hello there');
});
app.listen(port, () => console.log(`Example app listening on port ${port}!`));
上面写的代码是我所拥有的,而且它很乱。我要表达的意思是,当 运行 调用 index.js
文件 API 并执行 cron-schedule
时。现在,如果有一些新值添加到数据库中,我想重新运行 this.
Re运行ning index.js
是我的另一个选择,但我认为这不是正确的做法。我想到的下一个选项是调用上面提到的 /test
的另一个端点,最终将再次 运行 cron。
请让我知道一些建议或某种解决方案,以便我可以纠正错误。
使用这段代码我认为你可以做你想做的事,尽管你必须根据你的需要调整它来定义将执行任务的函数,或者如果你需要指定它们将被执行的时间以另一种方式(例如,设置一周中的特定日期)。
var times = [];
var tasks = [];
function addTask(time, fn) {
var timeArr = time.split(':');
var cronString = timeArr[1] + ' ' + timeArr[0] + ' * * *';
// according to https://github.com/node-schedule/node-schedule#cron-style-scheduling
var newTask = schedule.scheduleJob(cronString, fn);
// check if there was a task defined for this time and overwrite it
// this code would not allow inserting two tasks that are executed at the same time
var idx = times.indexOf(time);
if (idx > -1) tasks[idx] = newTask;
else {
times.push(time);
tasks.push(newTask);
}
}
function cancelTask(time) {
// https://github.com/node-schedule/node-schedule#jobcancelreschedule
var idx = times.indexOf(time);
if (idx > -1) {
tasks[idx].cancel();
tasks.splice(idx, 1);
times.splice(idx, 1);
}
}
function init(tasks) {
for (var i in tasks){
addTask(i, tasks[i]);
}
}
init({
"10:00": function(){ console.log("It's 10:00"); },
"11:00": function(){ console.log("It's 11:00"); },
"13:00": function(){ console.log("It's 13:00"); }
});
app.post('/addTask', (req, res) => {
if (!req.body.time.match(/^(0[0-9]|1[0-9]|2[0-3]|[0-9]):[0-5][0-9]$/)) {
// regex from
return res.status(400).json({'success': false, 'code': 'ERR_TIME'});
}
function fn() {
// I suppose you will not use this feature just to do console.logs
// and not sure how you plan to do the logic to create new tasks
console.log("It's " + req.body.time);
}
addTask(req.body.time, fn);
res.status(200).json({'success': true});
});