客户端代码中与控制台中对Meteor集合的访问不一致

客户端代码中与控制台中对Meteor集合的访问不一致,meteor,Meteor,非常简单的事情让我很难过。我可以通过使用mrt create创建一个空白应用程序来重现问题,只添加以下内容: 在第1行,我创建了一个新集合: Rounds = new Meteor.Collection('rounds'); Rounds.find({}).forEach(function (post){ console.log(post); }) Object {_id: "KAcopbPDE9JC2rShY", x: 1} Object {_id: "ps5KdA4b9it2ktQoD

非常简单的事情让我很难过。我可以通过使用
mrt create
创建一个空白应用程序来重现问题,只添加以下内容:

在第1行,我创建了一个新集合:

Rounds = new Meteor.Collection('rounds');
Rounds.find({}).forEach(function (post){
  console.log(post);
})
Object {_id: "KAcopbPDE9JC2rShY", x: 1}
Object {_id: "ps5KdA4b9it2ktQoD", x: 1}
Object {_id: "dqMuz6CmK2K9myZn5", x: 1}
Object {_id: "ecbWcRXXLQANy8Xyj", x: 1}
Object {_id: "QsbczHmZZMX59LzTZ", x: 1}
在Meteor.isClient的条件代码中,我添加了:

Rounds.insert({ x: 1 });

Rounds.find({}).forEach(function (round) {
    console.log(round);
});
当我第一次运行此代码时(在本地,使用
meteor run
),出现预期的行为,并将以下行打印到控制台:

Object {x: 1, _id: "ps5KdA4b9it2ktQoD"} 
但是,如果我刷新浏览器,会发生意外情况。我希望看到多行打印到控制台上,因为我正在为我的收藏添加更多的轮次。但是,仅打印最近一轮:

Object {_id: "dqMuz6CmK2K9myZn5", x: 1}
相反,如果我直接在控制台中运行上面的
forEach
行,我会得到预期的行为,集合中每一轮都有一行打印内容:

Rounds = new Meteor.Collection('rounds');
Rounds.find({}).forEach(function (post){
  console.log(post);
})
Object {_id: "KAcopbPDE9JC2rShY", x: 1}
Object {_id: "ps5KdA4b9it2ktQoD", x: 1}
Object {_id: "dqMuz6CmK2K9myZn5", x: 1}
Object {_id: "ecbWcRXXLQANy8Xyj", x: 1}
Object {_id: "QsbczHmZZMX59LzTZ", x: 1}
为什么这两种情况下的行为不同?而且,最重要的是,我如何在实际代码中重现我在控制台中发现的行为(这是我所期望的)


谢谢。

可能Meteor实际上还没有建立到服务器的连接,记住Meteor首先在客户端加载js&html(此时所有代码都在运行),然后尝试连接到服务器

在此状态下,您告诉它插入的命令进入一个队列,该队列在连接时一次插入。在客户端上,如果插入时成功,回调将立即触发

因此,要插入的代码将在连接尚未完全建立时运行

如果您等待建立连接(其中
Meteor.status().connected==true
),或等待完成订阅(通过在
Meteor.subscribe
的回调中插入数据),则不应该出现此问题

当您使用控制台时,连接已经建立,这就是为什么控制台中没有问题的原因

您可以尝试在尝试插入文档并查看的同时运行
console.log(Meteor.status().connection)