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

时间:2019-01-02 06:59:11

标签: javascript node.js reactjs mongodb triggers

我正在为用户提供一项功能,“他们在下订单时选择不久的将来的时间和日期。此订单的时间和日期存储在数据库中。”

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

我将分别对后端,服务器,数据库和前端使用Node JS,Express JS,Mongo DB,React JS。我要的是架构或创建触发器的执行方式,而不是完整的代码。

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

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

2 个答案:

答案 0 :(得分:0)

您可以使用以下软件包来实现您的目标: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
});

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

答案 1 :(得分:0)

为订单创建一个集合:

 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 });