获取订阅处理程序的“0”字段 returns 未定义但显示在控制台中

Getting the '0' field of a subscription handler returns undefined but is shown in the console

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

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

Bootstrap

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!
    }
});

最后一行可以看到日志:

console.log(cLogin);

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

出了什么问题?我如何访问这些数据?

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

所以这里可能发生的是一些异步函数在记录时间和您在控制台中打开对象之间将 属性 0 添加到 data

例如,参见 this answer 和关于该主题的讨论。

Meteor 订阅是被动的。
当您投射一个时,它开始到达服务器的发布处理程序。

本刊有两种解决方法:

这向客户表明出版物已准备就绪,他可以开始使用数据了。

为了跟踪这一点,您再次 two ways:

  • 原生方式:提供回调。我不确定 SQL 订阅是否允许。
  • Meteor 方式(由于您的屏幕截图,我知道它是受支持的):ready()
    ready() 是一个反应性数据源(因此是双关语)。这意味着您可以 运行 一个 Tracker computation
    此类计算在 template helpers.
    中原生实现 这是使用原生 Tracker 优势实现它的另一种方法:

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

看到您的用例,您可能想深入研究 template subscriptions or template computations