NodeJS 如何安排某个函数在某个日期运行?

5kgi1eie  于 2022-11-04  发布在  Node.js
关注(0)|答案(2)|浏览(129)

我有一个网站,允许用户在自己选择的日期给自己发送消息,但我不知道如何在特定的时间发送。我知道有CronJobs,但在这里,我不做任何重复的事情。这是一个一次性的事件触发器,我需要。
我第一次尝试使用原生的setTimeout,如下所示:

const dueTimestamp = ...; 
const timeLeft = dueTimestamp - Date().now(); 
const timeoutId = setTimeout(() => sendMessage(message), timeLeft);

它在短时间内运行得很好,但是我不确定它在长时间内是否可靠,比如几年甚至几十年。而且,它没有提供太多的控制,因为如果我想修改dueDate或消息的内容,我必须停止超时并启动一个新的超时。

**是否有任何软件包、库或服务可以让您在预定时间运行NodeJS函数?**或者您有任何解决方案吗?我听说过Google Cloud Schedule或Cronhooks,但我不确定。

o0lyfsai

o0lyfsai1#

您可以使用node-schedule库。例如:你想在2022年12月21日早上5:30运行一个函数。

const schedule = require('node-schedule');
const date = new Date(2022, 11, 21, 5, 30, 0);

const job = schedule.scheduleJob(date, function(){
  console.log('The world is going to end today.');
});
gudnpqoy

gudnpqoy2#

按照user3425506的建议,我只是使用了一个Cron作业从数据库中获取消息,并将消息发送给那些时间戳已过期的消息。
虚拟表示:

import { CronJob } from "cron";
import { fakeDB } from "./fakeDB";

const messages = fakeDB.messages;

const job = new CronJob("* * * * * *", () => {
  const currentTimestamp = new Date().getTime();

  messages.forEach((message, index) => {
    if (message.timestamp > currentTimestamp) return;

    console.log(message.message);

    messages.splice(index, 1);
  });
});

job.start();

相关问题