2016-12-29 54 views
0

我使用议程0.9.0,猫鼬4.7.5,合作4.6.5,由于某些未知的原因done()从来没有在任何地方都没有呼叫。作业超时,每10秒运行一次而不是2次(如果我不覆盖默认10分钟,它将每10分钟运行一次)。Nodejs调度程序(议程)与合作 - 无回调

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

回答

0

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

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块拦截,所以我完全失明了。