错误:没有光纤就等不及了



大家好,我在我的流星项目中带有铁路由器的一条路线中的回调功能。

问题是当我运行路径localhost:3000/scraper时,控制台显示以下消息:错误:等不及没有光纤

此代码刮到一个页面'x'。

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"});

如果有人可以帮助我,我将非常感激。非常感谢所有人。

请求库是仅在服务器上使用的节点库。在流星中运行节点库,需要像要求一样的异步回调确实需要一些额外的触摸

流星在所谓的纤维中运行所有东西。等效于JavaScript承诺。默认情况下,这使Meteor上下文中的所有Serveride代码都使代码更易于阅读。但是,Nodejs不使用纤维,因此您需要像这样包装其回调功能:

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

但是,由于您正在使用流星。为什么不使用其HTTP库?它的工作类似于Node的请求库,但也适用于客户,并且已经适用于您!

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

chris visser 的答案在这里不适用,因为 beriliox 正在尝试处理一个请求,而不是提出一个请求(是流星的HTTP软件包可以帮助您的。

解决问题的解决方案是声明处理程序函数async。这是由于流星用纤维运行的流星服务器代码看似同步的性质。

最新更新