4

我想在这里关注这个线程: 如何使用 Meteor 解析 HTML 服务器端?

不幸的是,这样做时我收到以下错误:

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

我希望能够在单击按钮以获取文本框中的内容并抓取它时调用一个函数,但是一旦我让代码工作,我可以稍后再做。

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

感谢您的时间,

乔纳森。

4

1 回答 1

3

服务器和客户端仍然是隔离的。在另一个帖子 Meteor.call中,用于将消息中继到服务器以在那里执行请求并将抓取结果返回给客户端。

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

这是您打算从客户端运行 http 请求吗?在客户端上存在诸如Access-Control-Allow-Origin.. 这就是为什么在那篇文章中对Meteor.call服务器进行了代理请求并将数据返回给客户端的原因。

在您的点击处理程序中,您可以使用如何使用 Meteor 解析 HTML 服务器端的代码?和:

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()      
    }
})
于 2013-03-06T07:02:37.753 回答