大家好,我在我的流星项目中使用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"});
如果有人能帮助我,我会非常感激。 非常感谢所有人。
答案 0 :(得分:1)
请求库是仅在服务器上运行的节点库。在meteor中运行需要异步回调(如require)的节点库需要一些额外的触摸
Meteor以所谓的光纤运行所有东西。相当于一个javascript承诺。这使得Meteor上下文中的所有服务器端代码默认为同步,这使代码更易于阅读。但是nodejs不使用Fibers,因此你需要包装它们的回调函数:
request(url, Meteor.bindEnvironment(function(error, response, html){
//Run stuff
}));
然而,因为你正在使用Meteor。为什么不使用它的HTTP库?它的工作方式类似于节点的请求库,但也适用于客户端,它已经可用于您!
HTTP.get(url, function(error, result) {
//Do stuff
});
答案 1 :(得分:0)
Chris Visser 的答案在这里不适用,因为 beriliox 试图处理一个请求,而不是发出一个请求(这是Meteor的HTTP包可以提供的帮助)与你同在。
该问题的解决方案是声明处理程序函数async
。这是由于在fibers中运行的Meteor服务器代码看似同步的特性。