2013-04-04 73 views
1

,當我運行此:在服務器上遺漏的類型錯誤,但工作在客戶端

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

它有一個錯誤出現:「遺漏的類型錯誤:無法讀取屬性未定義‘created_at’」,但是當我運行它在Web控制檯上顯示出預期的結果,即Posts.findOne({},{sort: {created_at:-1},reactive:false}).created_at;

回答

0

在調用數據之前,您需要確保您的訂閱已完成。

流星數據在線上發送,所以當您的javascript/html發送時,瀏覽器尚未被告知從服務器下載數據。

有兩種方式這一輪:

如果您使用的是與您的訂閱內容,您可以使用Deps.autorun

使用的DEP

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

+0

太謝謝你了!第二種解決方案完美運作。 – user1720271 2013-04-05 10:00:26

+0

如果我有足夠的聲望,我會投你一票lol – user1720271 2013-04-05 10:01:07

+0

不用擔心:)很高興爲你工作 – Akshat 2013-04-05 10:49:11

0

我會在該行代碼處添加一個斷點,並在您的JavaScript引擎即將運行時查看Posts集合中的內容。我的猜測是,你的Posts集合在之後正在加載文檔它遇到了該行代碼。當您使用Web控制檯進行檢查時,它的工作原因是因爲在文檔加載的時候。

相關問題