2017-06-02 67 views
1

大家好我在我的流星項目中使用鐵路路由器在一條路由中使用了回調函數。錯誤:無法等待沒有光纖

的問題是,當我運行的路徑本地主機:3000 /刮刀,控制檯顯示如下消息:錯誤:沒有纖維

不能等待此代碼刮除一頁「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"}); 

如果有人能幫助我,我會很感激。 非常感謝大家。

回答

1

請求庫是一個只能在服務器上工作的節點庫。在需要異步回調的流星中運行節點庫需要額外的觸摸

流星在所謂的光纖中運行一切。相當於一個JavaScript承諾。這使默認情況下Meteor上下文中的所有服務器端代碼都同步,這使代碼更易於閱讀。然而的NodeJS不使用光纖,因此,你需要換這樣的回調函數:

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

但是,由於您使用的流星。爲什麼不使用它的HTTP庫?它的作用類似於節點的請求庫,但也適用於客戶端及其已經可用的!

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