Вызов API в назначенное время - PullRequest
1 голос
/ 04 июня 2019

Я пытался выполнить вызов API в назначенное время.Я исследовал сайты и нашел этот пакет, называемый node-schedule от npmjs.Это работает, как и ожидалось, вызывая код в нужное время.У меня возникла проблема:

Предположим, у меня есть список времени, например: ["10:00","11:00","13:00"]

После запуска сервера он будет запущен в нужное время.Но что, если я хочу динамически изменить список времени?

Именно то, что я пытаюсь сделать:

  1. Вызов API и получение времени из базы данных
  2. Настройка cron-спланирование каждого из этих времен.
  3. Динамическое добавление нового времени в базу данных

Что я хочу: Динамическое добавление этого нового добавленного времени в 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 запускается.Теперь, если к БД добавлены какие-то новые значения, я хочу перезапустить это.

Перезапуск index.js - это еще один вариант, который у меня есть, но я не думаю, что это правильно.Следующий вариант, который я имею в виду, - это вызвать другую конечную точку, которая упоминается как /test выше, что в конечном итоге снова запустит cron.

Пожалуйста, дайте мне знать некоторые предложения или какое-то решение для этого, чтобы ямогу исправить мои ошибки.

1 Ответ

0 голосов
/ 04 июня 2019

С этим кодом я думаю, что вы можете делать то, что вы хотите, хотя вы должны адаптировать его к своим потребностям с точки зрения определения функций, которые будут выполнять задачи, или если вам нужно указать время, в которое они будут выполняться в другом способ (например, установка определенных дней недели).

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 https://stackoverflow.com/a/7536768/8296184
        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});
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...