Привет всем, у меня есть функция обратного вызова в одном маршруте с Iron Router в моем проекте meteor.
Проблема в том, что я запускаю путь 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"});
Если бы кто-то мог мне помочь, я был бы так благодарен. Большое спасибо всем.
Библиотека запросов - это библиотека узлов, которая работает только на сервере. Запуск библиотек узлов в метеор, требующих асинхронных обратных вызовов, таких как require, требует немного дополнительного касания
Метеор запускает все в так называемом волокне. Это эквивалент обещания javascript. Это делает весь код сервера в контексте Meteor по умолчанию синхронным, что упрощает чтение кода. Однако nodejs не используют Fibers, и поэтому вам нужно будет обернуть их функции обратного вызова следующим образом:
request(url, Meteor.bindEnvironment(function(error, response, html){
//Run stuff
}));
Однако, поскольку вы используете Meteor. Почему бы не использовать его HTTP-библиотеку? Он работает аналогично библиотеке запросов узлов, но также и для клиентов и уже доступных для вас!
HTTP.get(url, function(error, result) {
//Do stuff
});