在我的(基于express.js的)环回应用程序中,我想安排一个任务每1秒运行一次。它应该计算每个已打开的票,如果它们已经打开了某个时间,则应该发送电子邮件。下面是简化的代码。
问题是,按计划记录了“ scheduleJob”,但票证数量没有记录。我认为这是一个上下文问题。我应该如何记录找到的机票号码?我应该如何从count
的回调传递回schedule
的回调?
var schedule = require('node-schedule');
module.exports = function(app) {
var Ticket = app.models['Ticket']
var j = schedule.scheduleJob('* * * * * *', function(){
console.log('scheduleJob')
Ticket.count(function(err, count){
if (err) {console.log(err)}
console.log(count)
})
});
};
答案 0 :(得分:0)
请勿像这样计算所有未清票-这会花费大量资源。
您应该将故障单数量保留在node.js中,并增加/减少它。如果您有多个与数据库交互的进程,请使其中一个成为您的主数据库,并使其处理此任务。
关于您的问题,库node-schedule
似乎不支持异步调用。
算法
在程序启动时,查看数据库中的票证,并在应该发送电子邮件时检索下一个时间戳。
例如,如果要打开一张票并且您的数据库有:
,您想发送电子邮件ticket 1 / 10 min
ticket 2 / 40 min
因此,您的下一封邮件应在20分钟(60分钟-40分钟)内发送。
使用setTimeout()
在20分钟内唤醒您的节点。唤醒后,发送邮件,然后再次查看数据库以查找下一封要发送的邮件。
如果数据库中插入了新的票证,或者如果要删除/更新票证,请重新计算setTimeout
。