服务器上未捕获的TypeError,但在客户端上工作

时间:2013-04-04 23:41:58

标签: meteor

当我运行时:

  var vtop=Posts.findOne({},{sort: {created_at:-1},reactive:false}).created_at;
  console.log(vtop); 

它出现了一个错误:“未捕获的TypeError:无法读取未定义的属性'created_at'”,但是当我在Web控制台上运行Posts.findOne({},{sort: {created_at:-1},reactive:false}).created_at;时,它会出现预期的结果。

2 个答案:

答案 0 :(得分:0)

我会在该代码行中放置一个断点,并在您的JavaScript引擎即将运行时查看Posts集合中的内容。我的猜测是你的帖子集合在之后加载了文件,它遇到了那行代码。使用Web控制台检查时它的工作原因是因为文档已加载。

答案 1 :(得分:0)

在调用数据之前,您需要确保订阅完成。

流星数据是通过网络发送的,所以当你的javascript / html发送时,浏览器还没有被告知要从服务器下载数据。

这有两种方式:

如果您尚未进入舞台,则表示您正在使用自己的应用订阅,可以使用Deps.autorun

使用代表

Deps.autorun(function() {
    var subscribed = Session.equals("subscribed",true);
    if(!subscribed && Posts.find().count()) {
        Session.set("subscribed",true);

        var vtop = Posts.findOne({},{sort: {created_at:-1},reactive:false}).created_at;
        console.log(vtop)
    }

或等待订阅完成

服务器js

Meteor.publish("posts", function() {
    return Posts.find();
}

客户端js

Meteor.subscribe("posts",function() {
    var vtop = Posts.findOne({},{sort: {created_at:-1},reactive:false}).created_at;
    console.log(vtop)
});

如果使用发布/订阅,您需要删除autopublish包,但如果这样做,您还需要发布其他收藏集,否则浏览器将无法看到它们。

有关如何使用发布的详情,请参阅文档:http://docs.meteor.com/#publishandsubscribe

各方示例还使用发布并进行截屏视频:http://meteor.com/examples/parties