2012-10-29 102 views
0

我本質上是試圖在飛行中刮掉一個頁面。當你點擊這個網址時,它會輸出刮板作業的結果。一切都非常好,第一次。第二次嘗試它(使用通過job.options.args傳遞的不同參數),它甚至不會執行node.io作業的run()函數。 scrape_result第二次返回空(我期望一個對象)。Node.io刮擦作業第二次失敗

有什麼想法?我如何確保第二次獲得新結果?對於我的工作刮我幾乎完全使用例如#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') 
+0

我認爲,爲了幫助你,我們需要看到更多你的代碼。你是如何創建'scrip_scraper'的?我不認爲'scrip_scraper.job.options.args [0] = params;'正在做你想做的事情。 – Max

+0

@Max我在上面添加了更多的代碼。我找不到將爭論傳遞給我的工作的正確方法。使用options.args [0]是我能想到的最好的。它第一次美妙地運作。第二次,run()甚至不會執行。 –

回答

2

您可能遇到了範圍問題,因爲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); 
}; 
+0

這工作很好。不太確定爲什麼...... :)我試着實現你的解決方案的一部分,然後起初,它會在每個工作完成後終止我的節點服務器。但現在它效果很好。 –

+0

問題:我之前使用這個簽名來調用fn'nodeio.start(new nodeio.Job({timeout:10,silent:true},methods,callback,true))'。第二個參數是方法,而在你的例子中,第二個參數是config obj。 API是否改變了? –