Nodejs Scheduler(Agenda)with co - no callback

时间:2016-12-29 19:25:34

标签: node.js mongoose generator co agenda

我正在使用议程0.9.0,mongoose 4.7.5,co 4.6.5,由于某些未知原因,在任何地方都没有调用()。作业超时,每10秒而不是2秒运行(如果我不覆盖默认的10分钟,它将每10分钟运行一次)。

var co = require('co'),
Agenda = require('agenda');

var check = function (queryName, checkCursor, done) {
    console.log("1. this gets printed  ...");
    co(function*() {
        try {
            console.log("2. this gets printed");
            const cursor = checkCursor;
            for (let token = yield cursor.next(); token != null; token = yield cursor.next()) {
                console.log("this is not printed");
            }
        } finally {
            console.log("this is not printed");
        }
        console.log("this is not printed");
        done();
    }).then(function () {
        console.log("this is not printed");
        done();
    }, function () {
        console.log("this is not printed");
        done();
    }).catch(function(e) {
        console.log("this is not printed");
    });
};
var mongoose = require("mongoose");
var Schema = mongoose.Schema;

var TokenSchema = new Schema({
   ts: Number
});

var Token =  mongoose.model("Token", TokenSchema);
var enableChecks = function () {
var agenda = new Agenda();
agenda.database("mongodb://127.0.0.1:27017/eis", 'scheduler');
agenda.defaultLockLifetime(10000);
agenda.define("check old entries", function (job, done) {
    console.log("00. this get printed (job is run every 10s - it times out ): " + job.attrs.name);
    var c = Token.find({}).cursor();
    console.log("0. this gets printed (got cursor): " + job.attrs.name);
    check(job.attrs.name, c, done); // this collection is empty
});

agenda.on('ready', function () {
    agenda.every("2 seconds", "check old entries");
    agenda.start();
});
agenda.on('error', function (err) {
    console.log("Mongo connection failed");
});
};

enableChecks();

这是mongodb条目

{
   "_id" : ObjectId("58655e78711386ff39e651f1"),
   "name" : "check old entries",
   "type" : "single",
   "data" : null,
   "priority" : 0,
   "repeatInterval" : "2 seconds",
   "repeatTimezone" : null,
   "lastModifiedBy" : null,
   "nextRunAt" : ISODate("2016-12-29T19:05:30.118Z"),
   "lockedAt" : ISODate("2016-12-29T19:05:28.115Z"),
   "lastRunAt" : ISODate("2016-12-29T19:05:28.118Z")
}

1 个答案:

答案 0 :(得分:0)

获得的经验 - 尝试尽可能少地执行代码并减少所有其他库。我已经删除了议程,co并且只运行单个元素的简单打印。

http://thecodebarbarian.com/cursors-in-mongoose-45.html

const cursor = Token.find({}).cursor();
// Print the first document. Can also use callbacks
cursor.next.then(doc => { console.log(doc); });

抛出next不是函数。这暗示了猫鼬不合适(没有必要担心调查co,议程......)。我重新阅读了代码并发现我缺少mongoose.connect()。这个错误没有被任何try / catch块捕获,所以我完全失明了。