当到达存储在数据库中的未来日期、时间时,如何在 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 中触发事件?的主要内容,如果未能解决你的问题,请参考以下文章
当文件到达 NAS 时如何将文件从本地 NAS 移动到 AWS S3