1

大家好,在我的流星项目中,我在 Iron Router 的一条路线上有一个回调函数。

问题是当我运行路径 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"});

如果有人可以帮助我,我将不胜感激。非常感谢大家。

4

2 回答 2

1

请求库是一个仅在服务器上工作的节点库。在流星中运行需要异步回调的节点库(如 require 确实需要一点额外的接触)

Meteor 在所谓的 Fiber 中运行一切。相当于一个 javascript 承诺。这使得 Meteor 上下文中的所有服务器端代码默认同步,从而使代码更易于阅读。但是 nodejs 不使用 Fibers,因此您需要像这样包装它们的回调函数:

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

但是,由于您使用的是 Meteor。为什么不使用它的 HTTP 库?它的工作方式类似于节点的请求库,但也适用于客户端并且它已经为您提供!

HTTP.get(url, function(error, result) {
    //Do stuff
});
于 2017-06-02T22:41:46.463 回答
0

Chris Visser的答案在这里并不适用,因为beriliox正在尝试处理请求,而不是发出请求(这是 Meteor 的 HTTP 包可以帮助您解决的问题)。

该问题的解决方案是声明处理函数async。这是由于 Meteor 的服务器代码在 Fiber 中运行的看似同步的特性

于 2019-11-11T13:48:25.813 回答