Javascript 获取';0';订阅处理程序的字段返回未定义,但显示在控制台中

Javascript 获取';0';订阅处理程序的字段返回未定义,但显示在控制台中,javascript,meteor,javascript-objects,Javascript,Meteor,Javascript Objects,我有一个问题,当我在Meteor中记录JavaScript对象(订阅处理程序)时,我能够看到字段0,但我无法从代码中检索它 我正在使用numtel:mysql包。 以下是用于重现该问题的整个Meteor代码: 自举 Meteor.startup(function() { Meteor.readLiveDb = new LiveMysql(Meteor.Config.mysql.read); Meteor.writeLiveDb = new LiveMysql(Meteor.Con

我有一个问题,当我在Meteor中记录JavaScript对象(订阅处理程序)时,我能够看到字段
0
,但我无法从代码中检索它

我正在使用
numtel:mysql
包。
以下是用于重现该问题的整个Meteor代码:

自举

Meteor.startup(function() {
    Meteor.readLiveDb = new LiveMysql(Meteor.Config.mysql.read);
    Meteor.writeLiveDb = new LiveMysql(Meteor.Config.mysql.write);

    var closeAndExit = function() {
        Meteor.readLiveDb.end();
        Meteor.writeLiveDb.end();
        process.exit();
    };
    // Close connections on hot code push
    process.on('SIGTERM', closeAndExit);
    // Close connections on exit (ctrl + c)
    process.on('SIGINT', closeAndExit);

});
发布代码

Meteor.publish("checkLoginSubscription", function(username, password) {
    if(typeof username === undefined || typeof password === undefined) {
        throw new error('Username or password cannot be blank');
        return;
    }

    var user = Meteor.readLiveDb.select(
        'select * from users where username = "' + username + '" and password = "' + password + '"', [{
            table: 'users'
        }]
    );

    return user;
});
    Template.login.events({
    'submit #loginform': function(event) {
        event.preventDefault();
        $('#message').fadeIn();
        var username = event.target.username.value;
        var password = CryptoJS.MD5(event.target.password.value).toString();
        console.log('The Password entered is ', password);
        if(username == '' || password == '') {
            $('#message').addClass('alert-danger').removeClass('alert-success');
            $('#message').html('Username or password cannot be blank');
            return;
        }
        $('#message')
            .html('<img src="img/loaders/1.gif" alt="loading" /> Logging you in...')
            .addClass('alert-success')
            .removeClass('alert-danger');

        var cLogin = new MysqlSubscription('checkLoginSubscription', username, password);

        console.log(cLogin); // This is the variable holding the object

        console.log(cLogin[0]); //undefined!
    }
});
事件代码

Meteor.publish("checkLoginSubscription", function(username, password) {
    if(typeof username === undefined || typeof password === undefined) {
        throw new error('Username or password cannot be blank');
        return;
    }

    var user = Meteor.readLiveDb.select(
        'select * from users where username = "' + username + '" and password = "' + password + '"', [{
            table: 'users'
        }]
    );

    return user;
});
    Template.login.events({
    'submit #loginform': function(event) {
        event.preventDefault();
        $('#message').fadeIn();
        var username = event.target.username.value;
        var password = CryptoJS.MD5(event.target.password.value).toString();
        console.log('The Password entered is ', password);
        if(username == '' || password == '') {
            $('#message').addClass('alert-danger').removeClass('alert-success');
            $('#message').html('Username or password cannot be blank');
            return;
        }
        $('#message')
            .html('<img src="img/loaders/1.gif" alt="loading" /> Logging you in...')
            .addClass('alert-success')
            .removeClass('alert-danger');

        var cLogin = new MysqlSubscription('checkLoginSubscription', username, password);

        console.log(cLogin); // This is the variable holding the object

        console.log(cLogin[0]); //undefined!
    }
});

当我尝试获取处理程序的
0:Object
部分时,它返回
undefined


出什么事了?如何访问此数据?

console.log
对于对象是异步的,因为它只记录一个引用,在您单击它进行扩展时会对其进行评估。(值得注意的是,正如Bergi在评论中指出的那样,第一行捕获了日志调用时对象的当前状态)

因此,这里可能发生的情况是,在日志记录和您在控制台中打开对象之间,某个异步函数正在向
数据添加属性
0


例如,请参阅和关于该主题的讨论。

流星订阅是反应性的东西。
当您强制转换一个时,它开始转到服务器的发布处理程序

本出版物有两种解决方法:

  • 发布处理程序
    返回一个游标
  • 发布处理程序调用其
这向客户机发出信号,表示发布已准备就绪,并且他可以开始使用数据

要跟踪此情况,您必须再次执行以下操作:

  • 本机方法:提供回调。但我不确定SQL订阅是否允许这样做
  • Meteor way(由于您的屏幕截图,我知道它得到了支持):
    ready()

    ready()。这意味着你可以用它跑一圈
    这些计算是在中本机实现的。
    下面是使用本机跟踪程序实现它的另一种方法:

    Tracker.autorun(function doStuffOnceDataIsReady() {
      if(cLogin.ready()) {
        doStuff();
      }
    });
    

看到您的用例,您可能想深入研究或。

事实上,对象的第一行是记录时的同步捕获,它确实表明数组没有
0
属性。Awesome@kyll,让我把这件事做完,然后回去you@Guns如果您以前对Meteor和反应性以及
Tracker
和订阅处理不太了解,那么您将需要经历很多!谢谢@kyll,是的,我是meteor的新手,这是我的第一个项目,我被困在登录屏幕上:(@Guns好吧,你正在探索一个完全未知且相当特殊的领域,因此我建议坚持meteor提供的示例和教程以及一些不错的博客(关于或的旧文章)