Javascript 节点JS日程计划程序-缺少计划任务

Javascript 节点JS日程计划程序-缺少计划任务,javascript,node.js,scheduler,Javascript,Node.js,Scheduler,我使用议程插件作为调度程序(与express一起使用) 这是我的密码 var express = require('express'); var Agenda = require('agenda'); var agenda = new Agenda({db: { address: 'localhost:27017/express'}}); var app= express(); app.get('/notify', function(req,res){ res.type('text

我使用议程插件作为调度程序(与express一起使用)

这是我的密码

var express = require('express');
var Agenda = require('agenda');


var agenda = new Agenda({db: { address: 'localhost:27017/express'}});
var app= express();

app.get('/notify', function(req,res){
    res.type('text/plain');
    var message = req.param('message');
    agenda.now('send reminder', {data:message});    

    res.send(message);  
});

    agenda.define('send reminder', function(job,done){
        console.log(job.attrs.data.data);
    });


agenda.start();
app.listen(80);
这些就是我面临的问题

  • 并不是所有的消息都被打印出来
  • 有时,信息会被打印多次
  • 调用10次(大约)后,计划程序将永远停止
  • 调用计划的进程时至少有2秒的延迟

会有一些提示

我设置了一个测试,议程如下

var agenda = new Agenda();
agenda.database(config.db.host + ':' + config.db.port + '/' + config.db.name, 'jobs')
var i = 0;
agenda.define('some job', function(job) {
i++;
console.log( i+ " Run at " + new Date().getMinutes() + ":" + new Date().getSeconds());
});
agenda.every('10 seconds', 'some job');
agenda.start();
结果如下-

我在56:59跑

2在57:13跑步

3在57:28跑

4在57:43跑

5在57:58跑

6在58:13跑步

等等

我让作业运行了3个小时,但我仍然看到它在运行。我没有看到你的前三个观察结果。从第二次打印可以看出,每次运行都会延迟约5秒。这可能是因为我正在访问的远程数据库导致的mongo延迟和/或日志打印延迟。我以前使用过Agenda,如果您需要以秒的精度执行工作,我认为您不应该使用它


顺便说一句,为什么要对now事件使用调度程序,当需要记录时,不使用console.log()吗?如果您需要执行其他异步操作,这不是一个简单的调用吗。

我的代码中的问题是,我忘了调用done()方法

应该是

agenda.define('send reminder', function(job,done){
        console.log(job.attrs.data.data);
done();

    });


谢谢你的详细回答。我使用了议程网站中给出的示例,它每3分钟安排一次作业。不幸的是,这不起作用,因为我没有看到每3分钟执行一次作业。现在开始计划,我的解决方案是这样设计的,“安排一切”,这样我甚至可以记录正在发生的事情。我可能以后也会安排一些事情。如何在每个作业都有唯一id的情况下运行许多这样的计划作业,然后在按钮上停止一个特定的作业click@prc我试着遵循你的方法,但这个脚本似乎不起作用。它会导致类似于
未处理PromisejectionWarning:TypeError:无法读取未定义的
的属性'findOneAndUpdate'。您是否遇到了相同的问题或其他建议?请注意,如果您的代码是同步的,则可以省略
done
参数
agenda.define('send reminder', function(job){
        console.log(job.attrs.data.data);
    });