2013-03-06 43 views
4

我想按照這個線索在這裏:當這樣做 How can one parse HTML server-side with Meteor?使用Node JS Cheerio模塊進行刮取時存在服務器端問題?

不幸的是,我得到了以下錯誤:

Uncaught Error: Can't make a blocking HTTP call from the client; callback required. 

這裏是我的項目的JavaScript代碼:

var cheerio; 

if (Meteor.isClient) { 

    Template.entry.events = { 
    'click .btn_scrape' : function() { 
    $ = cheerio.load(Meteor.http.get("https://github.com/meteor/meteor").content); 
    console.log($('.commit-title').text().trim()); 
    }, 
} 
} 

if (Meteor.isServer) { 
    Meteor.startup(function() { 
    var require = __meteor_bootstrap__.require; 
    cheerio = __meteor_bootstrap__.require('cheerio'); 
    }); 


} 

如果我把代碼放在Meteor.startup(function()中...沒有任何反應,那麼就沒有錯誤,並且沒有任何東西被記錄到控制檯。

我希望能夠在點擊一個按鈕來獲取文本框中的內容並拖動它時調用一個函數,但是當我得到代碼工作後,我可以稍後再做。

難道有人偶然知道如何解決這個問題嗎?

謝謝你的時間,

喬納森。

回答

3

服務器和客戶端仍然是隔離的。在那個postMeteor.call被用來中繼消息到服務器在那裏做一個請求並且返回到客戶端的刮取結果。

你得到的錯誤是由於javascript在瀏覽器端處於異步狀態。有關更多信息here & here。您需要在客戶端代碼中使用回調,因爲從服務器獲取數據需要時間。

這是您打算從客戶端運行http請求嗎?在客戶端有一些問題,如Access-Control-Allow-Origin.。這就是爲什麼post a Meteor.call完成到服務器通過代理請求並將數據返回給客戶端。

在您單擊處理程序,你可以在How can one parse HTML server-side with Meteor?與使用的代碼:

Template.entry.events = { 
'click .btn_scrape' : function() { 
    $('.btn_scrape').attr('disabled','disabled') 
    Meteor.call("last_action",function(err,result){ 
     $('.btn_scrape').removeAttr('disabled') 
     console.log(result); 
    }); 
} 
} 

在你的代碼的Meteor.isServer部分,你仍然需要方法last_action到代理的數據到瀏覽器:

var cheerio = __meteor_bootstrap__.require('cheerio'); 
Meteor.methods({ 
last_action: function() { 
     $ = cheerio.load(Meteor.http.get("https://github.com/meteor/meteor").content); 
     return $('.commit-title').text().trim()  
    } 
}) 
+0

謝謝!我能夠解決這個問題 – yonatano 2013-03-08 17:52:31

相關問題