Node.io ломать работу не удается во второй раз
По сути, я пытаюсь наскрести страницу на лету. Когда вы нажимаете этот URL, он выводит результат задания очистки. Все работает чудесно с первого раза. Во второй раз, когда я попробую (с другими параметрами, переданными через job.options.args), он даже не выполнит функцию run() задания node.io. scrape_result
возвращается пустой во второй раз (я ожидаю объект).
Какие-нибудь мысли? Как я могу гарантировать, что новые результаты будут возвращены во второй раз? В своей работе я почти точно использую пример № 3 здесь: https://github.com/chriso/node.io/wiki/Scraping
отрывок из scraper.js (остальное похоже на пример № 3: https://github.com/chriso/node.io/wiki/Scraping)
run: function() {
var book = this.options.args[0].book;
var chapter = this.options.args[0].chapter;
this.getHtml('http://www.url.com' + book + '/' + chapter + '?lang=eng', function(err, $) {
Тогда мой app.js
var scrip_scraper = require('./scraper.js');
app.get('/verses/:book/:chapter', function (req, res) {
var params = {
book: req.param('book'),
chapter: req.param('chapter')
}
scrip_scraper.job.options.args[0] = params;
//scrip_scraper.job.options.args.push(chapter);
console.log(scrip_scraper.job.options.args);
nodeio.start(scrip_scraper, function (err, scrape_result) {
console.log(scrape_result);
}, true);
}); //app.get('/verses/:book/:chapter')
1 ответ
Вы, вероятно, сталкиваетесь с проблемами определения объема, потому что options.args
может измениться во время выполнения запроса. Попробуйте передать входные данные в задание в качестве аргумента функции, чтобы они не могли быть изменены другим запросом. Вот пример, который вы можете адаптировать к вашим потребностям
app.js
var express = require('express')
, scraper = require('./scraper')
, app = express();
app.get('/:keyword', function (request, response, next) {
scraper(request.param('keyword'), function (err, result) {
if (err) {
return next(err);
}
response.send(result);
});
});
app.listen(3000);
scraper.js
var nodeio = require('node.io');
module.exports = function (keyword, callback) {
var job = new nodeio.Job({
input: [ keyword ]
, run: function (keyword) {
//Make the request here..
this.emit(keyword);
}
});
nodeio.start(job, { silent: true }, callback, true);
};