Ошибка: не могу ждать без волокна

Привет всем, у меня есть функция обратного вызова в одном маршруте с Iron Router в моем метеорологическом проекте.

Проблема заключается в том, что когда я запускаю путь localhost:3000/scraper, консоль показывает следующее сообщение: Ошибка: не могу ждать без оптоволокна

Этот код скрести на одну страницу "х".

Router.route('/scraper', function(){
  this.response.setHeader( 'Access-Control-Allow-Origin', '*' );
  this.response.setHeader( 'Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE' );
  this.response.setHeader( 'Access-Control-Allow-Headers', 'Content-Type, X-Requested-With, x-request-metadata' );
  this.response.setHeader( 'Access-Control-Allow-Credentials', true );

  var url = 'https://scholar.google.cl/citations?user= ... &hl=es';
  request(url, function(error, response, html){
    if(!error){
      var $ = cheerio.load(html);

      var json_pre = {  id_usuario: "",
                        autor : "",
                        imagen_usuario: ""
                     };

      $('#gsc_prf_in').filter(function(){
        var data = $(this);
        autor = data.text().trim();

        json_pre.autor = autor;
      })

      $('input[name="user"]').filter(function(){
        var data = $(this);
        id_usuario = data.val();

        json_pre.id_usuario = id_usuario;
      })

      $('#gsc_prf_pup').filter(function(){
        var data = $(this);
        imagen_usuario = data.attr('src');

        json_pre.imagen_usuario = imagen_usuario;
      })

      .....

    }

    var json = JSON.stringify(json_pre, null, 4);

    //************************************************ 


                          //Can't wait without a fiber

      var id_usuario_m = Scrapers.findOne({id_usuario :json_pre.id_usuario });
      if (id_usuario_m) {
        Scrapers.update({id_usuario :json_pre.id_usuario }, {$set: json_pre});
        console.log('Usuario Actualizado');
      } else {
        Scrapers.insert(json_pre);
        console.log('Usuario Insertado')
      }

    //************************************************


  })

  this.response.end('Fin de la scrapeada');

}, {where : "server"});

Если бы кто-то мог мне помочь, я был бы так благодарен. Большое спасибо всем.

1 ответ

Библиотека запросов - это библиотека узлов, которая работает только на сервере. Для запуска библиотек узлов в метеоре, которые требуют асинхронных обратных вызовов, таких как require, требуется немного дополнительного прикосновения

Метеор управляет всем в так называемом волокне. Эквивалент обещания JavaScript. Это делает весь серверный код в контексте Meteor синхронным по умолчанию, что облегчает чтение кода. Однако nodejs не используют Fibers, и поэтому вам нужно будет обернуть их функции обратного вызова следующим образом:

request(url, Meteor.bindEnvironment(function(error, response, html){
    //Run stuff
}));

Однако, так как вы используете Метеор. Почему бы не использовать его HTTP-библиотеку? Он работает аналогично библиотеке запросов узла, но также для клиентской части и уже доступен для вас!

HTTP.get(url, function(error, result) {
    //Do stuff
});

Ответ Криса Виссера здесь неприменим, поскольку beriliox пытается обработать запрос, а не сделать его (в этом вам может помочь HTTP-пакет Meteor).

Решение проблемы - объявить функцию-обработчик async. Это связано с кажущейся синхронной природой кода сервера Meteor, работающего в волокнах.

Другие вопросы по тегам