使用Node JS Cheerio模块进行抓取时出现服务器问题?

时间:2013-03-06 02:47:46

标签: javascript meteor scraper

我想在这里关注这个帖子: How can one parse HTML server-side with Meteor?

不幸的是,这样做会出现以下错误:

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()......没有任何反应,没有任何错误,并且没有任何内容记录到控制台。

我希望能够在单击按钮时调用函数来获取文本框中的内容并将其删除,但是我可以在稍后使代码工作后再执行此操作。

有人偶然知道如何解决这个问题吗?

感谢您的时间,

乔纳森。

1 个答案:

答案 0 :(得分:3)

服务器端和客户端仍然是隔离的。其他post Meteor.call用于将消息中继到服务器以在那里进行请求,并将刮取结果返回给客户端。

你得到的错误是由于javascript在浏览器方面是异步的。有关here&的更多信息here。您需要使用带有客户端代码的回调,因为从服务器获取数据需要时间。

这是您打算从客户端运行http请求吗?在客户端上存在诸如Access-Control-Allow-Origin.之类的问题。这就是为什么post对服务器进行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()      
    }
})