2015-11-04 102 views
2

這是堆棧跟蹤:當我在我的項目中運行server.js文件時會發生這種情況。我在網上也找不到任何解釋。有人可以幫助解決這個錯誤嗎?「TypeError:無法讀取未定義的屬性''。在agenda.js中這是什麼意思?

E:\users\ashane\documents\visual studio 2015\Projects\ShowTracker\ShowTracker\node_modules\agenda\lib\agenda.js:341 
    if (this._mdb.s.topology.connections().length === 0) {    ^

TypeError: Cannot read property 's' of undefined 
    at Agenda._findAndLockNextJob (E:\users\ashane\documents\visual studio 2015\Projects\ShowTracker\ShowTracker\node_modules\agenda\lib\agenda.js:341:17) at jobQueueFilling (E:\users\ashane\documents\visual studio 2015\Projects\ShowTracker\ShowTracker\node_modules\agenda\lib\agenda.js:420:10) at processJobs (E:\users\ashane\documents\visual studio 2015\Projects\ShowTracker\ShowTracker\node_modules\agenda\lib\agenda.js:404:7) 

    at doNTCallback0 (node.js:417:9) 
    at process._tickCallback (node.js:346:13) 
    at Function.Module.runMain (module.js:469:11) 
    at startup (node.js:134:18) 
    at node.js:961:3 

這些是使用angenda唯一代碼和 「s」 <作爲字符串

var mongoConnectionString = "mongodb://127.0.0.1/agenda"; 
var agenda = require('agenda')({ db: { address: mongoConnectionString } }); 
var sugar = require('sugar'); 
var nodemailer = require('nodemailer'); 

// define an agenda job called send email alert. 

agenda.define('send email alert', function (job, done) { 
    // what should happen when send email alert job is dispatched. 
    // When this job runs, name of the show will be passed in as an optional data object. 
    // Since we are not storing the entire user document in subscribers array (only references), 
    // we have to use Mongoose’s populate method. 
    Show.findOne({ name: job.attrs.data }).populate('subscribers').exec(function (err, show) { 
     var emails = show.subscribers.map(function (user) { 
      return user.email; 
     }); 

     var upcomingEpisode = show.episodes.filter(function (episode) { 
      return new Date(episode.firstAired) > new Date(); 
     })[0]; 

     var smtpTransport = nodemailer.createTransport('SMTP', { 
      service: 'SendGrid', 
      auth: { user: 'hslogin', pass: 'hspassword00' } 
     }); 

     // standard Nodemailer boilerplate for sending emails. 
     var mailOptions = { 
      from: 'Fred Foo ✔ <[email protected]>', 
      to: emails.join(','), 
      subject: show.name + ' is starting soon!', 
      text: show.name + ' starts in less than 2 hours on ' + show.network + '.\n\n' + 
     'Episode ' + upcomingEpisode.episodeNumber + ' Overview\n\n' + upcomingEpisode.overview 
     }; 

     smtpTransport.sendMail(mailOptions, function (error, response) { 
      console.log('Message sent: ' + response.message); 
      smtpTransport.close(); 
      done(); 
     }); 
    }); 
}); 

agenda.start(); 

agenda.on('start', function (job) { 
    console.log("Job %s starting", job.attrs.name); 
}); 

agenda.on('complete', function (job) { 
    console.log("Job %s finished", job.attrs.name); 
}); 
+0

這意味着代碼試圖訪問未定義的對象變量的屬性's'。如果您需要更多幫助,請告訴我們發生這種情況的代碼。源文件是您寫的東西,還是您使用的依賴項? – Antoine

+0

@Antoine這些代碼只使用議程節點模塊 –

回答

2

在agenda.js,在線路if (this._mdb.s.topology.connections().length === 0)this._mdb是未定義的。

方法Agent.prototype.database指定給_mdb返回的db對象來自MongoClient.connect。所以我的猜測是連接操作失敗。你確定你的連接字符串?

+0

好吧我已經把連接字符串chacked到'localhost:27017/test'仍然給我一個錯誤。 mongodb表示正在監聽端口27017 –

+0

Mongo連接字符串的格式必須是'mongo:// [server]:[port]/[dbname]'。主機/端口之後的部分是要連接的數據庫的名稱。確保它正確寫入,並檢查權限。 – Antoine

+0

好吧,它仍然給我一個錯誤,被試用的主機是:'localhost:27017/test,127.0.0.1:27017/test,localhost:52332/test' < - 當mogos shell啓動時。仍然給我一個錯誤。 –

7

它在.on('ready')函數存在時起作用。這是我的例子。

var Agenda = require('agenda'); 
var agenda = new Agenda({db: { address: 'localhost:27017/servicebox-dev'}}); 
matcher.matchProviders(agenda); 
agenda.on('ready', function() { 
    agenda.every('5 seconds', 'match providers'); 
    agenda.start(); 
}); 
+0

這也解決了我的問題。有趣的是如何有這麼多的例子不使用.on() – sidonaldson

+0

這真的需要得到更多的投票.. – pravin

+0

接受的答案是不是很有幫助。我想大多數人知道使用一個工作連接字符串。但是,這個答案解決了我的問題。 –

相關問題