2016-12-29 55 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塊攔截,所以我完全失明瞭。