4

ここでこのスレッドをフォローしようとしています: 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()... に入れると、何も起こらず、エラーもコンソールにも何も記録されません。

ボタンをクリックしてテキストボックスのコンテンツを取得してスクレイプしたときに関数を呼び出せるようにしたいのですが、コードが機能するようになったら後で実行できます。

これを修正する方法を知っている人はいますか?

お時間をいただきありがとうございます。

ジョナサン。

4

1 に答える 1

3

サーバー側とクライアント側はまだ分離されています。その他の投稿 Meteor.callでは、メッセージをサーバーに中継してそこでリクエストを実行し、スクレイプ結果をクライアントに返すために使用されます。

あなたが得ているエラーは、JavaScriptがブラウザ側で非同期であるためです。その詳細については、こちらこちらをご覧ください。サーバーからデータを取得するには時間がかかるため、クライアント側のコードでコールバックを使用する必要があります。

これは、クライアントから http 要求を実行する意図ですか? クライアントには、Access-Control-Allow-Origin.. これが、その投稿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()      
    }
})
于 2013-03-06T07:02:37.753 に答える