当到达存储在数据库中的未来日期、时间时,如何在 Node JS 中触发事件?

Posted

技术标签:

【中文标题】当到达存储在数据库中的未来日期、时间时,如何在 Node JS 中触发事件?【英文标题】:How to Trigger Events in Node JS when a future date, time stored in Database is reached? 【发布时间】:2019-05-28 20:53:26 【问题描述】:

我正在向用户提供一个功能,“他们在下订单时选择一个近期的时间和日期。这个订单的时间和日期存储在数据库中。”

当达到数据库中的时间和日期时,如何触发函数执行某些操作?

我将分别在后端、服务器、数据库和前端使用 Node JS、Express JS、Mongo DB、React JS。我要求的是架构或创建这样的触发器来说明如何执行,而不是完整的代码。

任何支持 NPM 包的建议都会有所帮助。谢谢。

注意:这是我第一次使用任何语言开发应用程序。我仅从 Udemy 课程中学到了这些技术。应用程序将让用户选择未来的日期,当到达未来日期时,应用程序会为他们执行一些功能。

【问题讨论】:

尝试使用moment js 使用setInterval 但限制是页面不应该被重新加载。或者您可以在重新加载页面后创建间隔。 【参考方案1】:

为订单创建集合:

 const orders = db.collection("orders");

然后在到期日创建索引以便更快地建立索引:

orders.createIndex( dueDate: 1 );

现在您可以启动服务以获取最低日期,并检查是否已经到达,否则休眠:

const sleep = ms => new Promise(res => setTimeout(res, ms));

(async function() 
  while(true)   // check forever
    await sleep(2000);
    const cursor = orders.find( dueDate:  $lte: Date.now() , processed: false ); // only take those that are done but not yet processed
    while(await cursor.hasNext()) 
      const order = await cursor.next();   
      // process order
      await orders.updateOne(order,  $set:  processed: true );
    
  
)();

然后只需将新文档添加到该集合并观看魔术:)

 orders.insertOne( processed: false, dueDate: Date.now() + 5000 );

【讨论】:

【参考方案2】:

您可以使用以下软件包来实现您的目标:node-schedule

例如:

var schedule = require('node-schedule');
var date = // get date from databse and create a date object for eg: new Date(2012, 11, 21, 5, 30, 0);

var j = schedule.scheduleJob(date, function()
  console.log('The world is going to end today.');
  // once the job is finished remove the database entry mark it as completed so that it won't run again
);

注意: 在启动时,您还可以添加验证以检查您的作业日期并安排日期是否在将来,或者如果它已经过去且未完成则调用该方法,这在部署应用程序时很有帮助

【讨论】:

这似乎是最简单且有效的解决方案。谢谢! 所以我需要在收到订单后立即启动 scheduleJob? 是的,您必须通过订单日期,它将在该日期自动触发。 如果部署的服务器在调度和调用方法之间的时间重新启动,作业将无法完成,因为它将从内存中删除,对吗? @PiyushZalani 那么有数以万计的订单要处理,每个订单都会在内存中创建一个 cronjob 吗?这是一个好习惯吗,我有一个类似的用例。

以上是关于当到达存储在数据库中的未来日期、时间时,如何在 Node JS 中触发事件?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js,基于日期时间的提醒

活动加载一次又一次

当文件到达 NAS 时如何将文件从本地 NAS 移动到 AWS S3

如何在 SharedPreferences 中保存和检索日期

如何禁用日历中的未来日期? [复制]

当用户到达页面中的特定点时如何打印内容? (不依赖于任何类或 ID 元素)