Javascript &引用;TypeError:无法读取属性';s';“未定义的”;。这在agenda.js中是什么意思?

Javascript &引用;TypeError:无法读取属性';s';“未定义的”;。这在agenda.js中是什么意思?,javascript,node.js,visual-studio-2015,Javascript,Node.js,Visual Studio 2015,这是堆栈跟踪:当我在项目中运行server.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 ) {

这是堆栈跟踪:当我在项目中运行server.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 ✔ <foo@blurdybloop.com>',
            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);
});
var mongoConnectionString=”mongodb://127.0.0.1/agenda";
var agenda=require('agenda')({db:{address:mongoConnectionString}});
var sugar=要求(“糖”);
var nodeEmailer=require('nodeEmailer');
//定义名为“发送电子邮件警报”的议程作业。
议程.定义('发送电子邮件警报')功能(工作,完成){
//发送电子邮件警报作业被调度时应该发生什么情况。
//当此作业运行时,显示的名称将作为可选数据对象传入。
//由于我们没有将整个用户文档存储在订阅服务器数组中(仅引用),
//我们必须使用Mongoose的填充方法。
Show.findOne({name:job.attrs.data}).populate('subscribers').exec(函数(err,Show){
var emails=show.subscribers.map(函数(用户){
返回user.email;
});
var upcomingEpisode=show.scents.filter(函数(情节){
返回新日期(eposion.firstAired)>新日期();
})[0];
var smtpTransport=nodemailer.createTransport('SMTP'{
服务:“SendGrid”,
身份验证:{user:'hslogin',pass:'hspassword00'}
});
//用于发送电子邮件的标准NodeEmailer样板。
var mailpoptions={
来自:福瑞德✔ ',
收件人:emails.join(“,”),
主题:show.name+'即将开始!',
文本:show.name+'在“+show.network+”上不到2小时后开始。\n\n+
“插曲”+upcomingEpisode.eposeNumber+“概述\n\n”+upcomingEpisode.Overview
};
发送邮件(邮件选项,函数(错误,响应){
console.log('messagesent:'+response.Message);
smtpTransport.close();
完成();
});
});
});
议程.开始();
议程。关于(‘开始’、职能(工作){
console.log(“作业%s正在启动”,作业.attrs.name);
});
议程。‘完成’功能(工作){
console.log(“作业%s已完成”,作业.attrs.name);
});

在agenda.js中的
行中,如果(this.\u mdb.s.topology.connections().length==0)
未定义this.\u mdb

方法
Agent.prototype.database
将从
MongoClient.connect
返回的
db
对象分配给
\u mdb
。所以我猜连接操作失败了。您确定您的连接字符串吗?

当.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();
});

这意味着代码试图访问未定义的对象变量的属性
s
。如果需要更多帮助,请向我们展示发生这种情况的代码。源文件是您编写的还是您正在使用的依赖项?@Antoine这些代码仅使用议程节点模块。我已将连接字符串更改为“localhost:27017/test”,但仍然会给我一个错误。mongodb说监听端口27017Mongo连接字符串的格式必须是
mongo://[server]:[port]/[dbname]
。主机/端口后面的部分是要连接到的数据库的名称。请确保写入的内容正确,并检查权限。好的,它仍然会给我一个错误尝试的主机是:
localhost:27017/test,127.0.0.1:27017/test,localhost:52332/test
,使用相同的连接字符串,你能用shell或类似robomongo的gui工具连接到db吗?mongoshell并不完全使用连接字符串,但你可以看到:这也解决了我的问题。有趣的是,有这么多的例子没有使用。on()接受的答案并不是很有帮助。我想大多数人都知道如何使用有效的连接字符串。然而,这个答案解决了我的问题。