Проблемы на стороне сервера при очистке с помощью модуля Node JS Cheerio?

Я пытаюсь следить за этой темой здесь: Как можно проанализировать HTML на стороне сервера с помощью 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()...), ничего не произойдет, ошибки не будет и в консоль ничего не записывается.

Я хотел бы иметь возможность вызывать функцию при нажатии кнопки, чтобы получить содержимое в текстовом поле и очистить его, но это я могу сделать позже, когда код заработает.

Может кто случайно не знает как это исправить?

Спасибо за уделенное время,

Джонатан.


person TheProofIsTrivium    schedule 06.03.2013    source источник


Ответы (1)


Серверная и клиентская стороны по-прежнему разделены. В этом другом post Meteor.call используется для ретрансляции сообщение на сервер, чтобы сделать запрос и вернуть результат очистки обратно клиенту.

Ошибка, которую вы получаете, связана с асинхронностью javascript на стороне браузера. Подробнее об этом здесь и здесь. Вам нужно использовать обратный вызов с кодом на стороне клиента, потому что для получения данных с сервера требуется время.

Это ваше намерение запустить http-запрос с клиента? На клиенте есть такие проблемы, как Access-Control-Allow-Origin.. Вот почему в этом post делается Meteor.call серверу для проксирования запроса и возврата данных клиенту.

В вашем обработчике кликов вы можете использовать код в Как можно проанализировать HTML на стороне сервера с 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()      
    }
})
person Tarang    schedule 06.03.2013