2014-05-11 47 views
1

我對JS完全陌生,完全停留在Node Cheerio上。如果有人能幫助我,我將不勝感激。Cheerio(node.js)在html上返回錯誤

我正在處理的代碼是:https://github.com/zafartahirov/bitstarter

(找不到的代碼將在找到修復程序後稱爲grader.old.js)。

當我運行

node ./grader.js --file index.html --checks checks.json | less 

我收到一個錯誤:

TypeError: Cannot call method 'utf8Slice' of null 
    at Buffer.toString (buffer.js:416:26) 
    at exports.isTag (/home/ubuntu/GitHub/bitstarter/node_modules/cheerio/lib/utils.js:15:14) 
    at Function.filter (/home/ubuntu/GitHub/bitstarter/node_modules/cheerio/node_modules/lodash/dist/lodash.js:3150:15) 
    at /home/ubuntu/GitHub/bitstarter/node_modules/cheerio/lib/api/traversing.js:9:26 
    at Function.reduce (/home/ubuntu/GitHub/bitstarter/node_modules/cheerio/node_modules/lodash/dist/lodash.js:3734:25) 
    at exports.find (/home/ubuntu/GitHub/bitstarter/node_modules/cheerio/lib/api/traversing.js:8:17) 
    at new module.exports (/home/ubuntu/GitHub/bitstarter/node_modules/cheerio/lib/cheerio.js:92:18) 
    at initialize (/home/ubuntu/GitHub/bitstarter/node_modules/cheerio/lib/static.js:23:12) 
    at checkHtmlFile (/home/ubuntu/GitHub/bitstarter/grader.js:59:23) 
    at Object.<anonymous> (/home/ubuntu/GitHub/bitstarter/grader.js:76:21) 
(END) 

有什麼建議?

+1

我想我找到了解決辦法,但我還是不明白的東西: 'VAR cheerioHtmlFile =功能(HTMLFILE){VAR 緩衝= fs.readFileSync(HTMLFILE); return cheerio.load(buffer.toString()); // return cheerio.load(fs.readFileSync(htmlfile)); };' 我仍然不明白爲什麼我必須將緩衝區轉換爲字符串。 – RafazZ

+1

在這種情況下,我強烈建議閱讀http://www.joelonsoftware.com/articles/Unicode.html –

+0

謝謝!我一定會這樣做! – RafazZ

回答

4

我們採取了相同的過程,花了相當多的時間來調試它。 看來cheerio.load()方法需要一個字符串作爲參數而不是緩衝區。

+0

)調用readFileSync,則不需要在緩衝區上使用toString。那我該如何解決它。我想我很困惑,因爲「虛擬」代碼沒有在評論中,謝謝你! – RafazZ

+1

以前它接受了一個Buffer對象,但是這個被改變了。我已經打開了一個問題,並會根據需要提交PR:https://github.com/cheeriojs/cheerio/issues/485 –