2013-10-10 111 views
0

我已用實際代碼更新了帖子。從回調中調用函數會導致節點應用程序掛起

問題是節點應用程序掛起並不會退出,除非我在addArticle中註釋掉查詢。我很想知道我在這裏做錯了什麼(關於懸掛問題)。

function addArticle(title, text, date, link) { 
    connection.query("SELECT * FROM articles WHERE link LIKE "+connection.escape(link), function(error, rows, fields) { 
    if(rows.length == 0) { 
     console.log("article not in database"); 
     console.log(connection.escape(title)); 
     var values = [connection.escape(title), connection.escape(text), date, connection.escape(link), '{}']; 
     connection.query("INSERT INTO articles (title, text, date, link, topics) VALUES ?", [[values]], function(err) { 
     if(err) throw err; 
     }); 
    } 
    }); 
} 

function scrapeReuters() { 
    var url = 'http://www.reuters.com/news/archive/technologyNews?date=10092013'; 
    request(url, function(err, resp, body){ 
     $ = cheerio.load(body); 
     links = $('a'); 
     $(links).each(function(i, link){ 
     var addr = $(link).attr('href'); 
     if(addr != undefined && addr.indexOf('article') != -1 && addr.indexOf('http') == -1) { 
      var full_link = "http://www.reuters.com"+addr; 
      var title = $(link).text(); 
      request(full_link, function(err, resp, body){ 
      $ = cheerio.load(body); 
      para = $('p').text(); 
      addArticle(title, para,new Date().getTime(), full_link); 
      }); 
     } 
     }); 
    }); 
} 
+0

什麼是'foo'之後呢?你可以做一些'console.log'來查看你的控制流向哪裏? – Bergi

+1

'c'是'foo'中的回調函數嗎?如果是這樣,你需要在回調'connection.query'中調用'c()'。您需要提供較少的神祕功能/參數名稱以獲得更有用的評論或答案。 –

回答

0

你可能需要的所有查詢完成後,關閉連接。您可以嘗試使用https://github.com/caolan/async庫按順序運行查詢,然後在主回調中關閉連接。

它有點棘手,但首先你需要定義一個要執行的函數數組。然後你運行async.sequence(arrayOfFns,masterCallback)。主回調得到錯誤和結果(注意複數,它來自所有函數)。在該主回調中,終止mysql連接/和或結束進程。

爲此,我會重寫addArticle查詢以返回查詢字符串。然後你$(links).each循環之前,我會做稱爲數組toInsert

在每一個循環,我會說

toInsert.push(function(callback) { 
    connection.query(addArticle(...),function(err) { 
     if(err) callback(err); 
     else callback(null,true); 
    }); 
}); 

循環運行

async.sequence(toInsert,function(errs,results) { 
     connection.close() //not sure if correct 
     process.exit(); //maybe, if needed? 
}); 
+0

關閉連接確實是我需要做的。有趣的是,在任何函數之外分配連接變量會導致connection.end()調用引發異常。將該代碼移動到實際的數據庫交互的函數中可以解決這個問題。 – John

相關問題