2013-07-25 65 views
2

我想在javascript中製作一個.smil(.xml)解析器。 但是當我想測試它時,node.js只是說我:buffer.js:246「對象1沒有方法」toLowerCase'

buffer.js:246 
    switch(encoding && encoding.toLowerCase()){ 
           ^
TypeError: Object 1 has no method 'toLowerCase' 
    at Function.Buffer.isEncoding (buffer.js:246:32) 
    at assertEncoding (fs.js:98:27) 
    at Object.fsread (fs.js:422:5) 
    at gets (/home/pi/SMIL_Parser.js:8:8) 
    at read_until (/home/pi/SMIL_Parser.js:28:14) 
    at home/pi/SMIL_Parser.js:64:14 
    at Object.oncomplete (fs.js:93.15) 

得到()確實是我的功能之一:

var io=require('fs'); 
... 
function gets (file){ 
    var chaine="", cache="", pkmn=0; 
    io.read(file, cache, 0, 1, null, function(err, byte, buf){ 
     if (err || byte===0){return -1;} 
     while ((cache!=="\n")) 
     { 
      chaine=chaine+cache; 
      cache=""; 
      pkmn=io.readSync(file, cache, 0, 1, null); 
      if (pkmn===0){return -1;} 
     } 
    }); 
} 

我只是不有什麼出了問題,它似乎任何想法要讀,但我已經確信得到正確的參數,試圖更新node.js,fs和npm。我在google上發現的唯一類似錯誤是更新問題。

編輯: 添加完整的錯誤消息,在這裏發揮作用read_until:

function read_until(smil, limit){ 
    var line=""; 
    do 
    { 
     line=gets(smil); 
     if (line===-1){return -1} 
    }while (!(line.search(limit))); 
    return 0; 
} 

function parse (pathname){ 
    var smil=0, line="", pkmn=0; 
    io.open(pathname, 'r', function (err, fd){ 
     if (err){return -1;} 
     smil=fd; 
     pkmn=read_until(smil, "<smil>"); 
     ... 
+1

這樣看來, 「編碼」類型不是字符串。 – ChrisCM

+0

當然,但是有什麼辦法從讀取或其他庫函數獲取消息嗎?所以我可以知道這個var是否沒有正確初始化? – DrakaSAN

+1

你應該能夠看到你的堆棧跟蹤,哪一行正在產生呼叫。如果我們知道'gets'函數中的哪一行導致對Function.Buffer.isEncoding的調用,我們可以提供更多幫助。或者,像這樣的一行:Object.fsread(fs.js:422:5)。除了fs.js:422:5之外,我們希望第一行與您開發的文件的名稱相匹配,它應該與包含「gets」函數的文件相匹配。 – ChrisCM

回答

2

fs.readtakes a buffer not a string.

更改緩存是一個緩衝。

function gets (file){ 
    var chaine="", cache=new Buffer(), pkmn=0; 
    io.read(file, cache, 0, 1, null, function(err, byte, buf){ 
     if (err || byte===0){return -1;} 
     while ((cache!=="\n")) 
     { 
      chaine=chaine+cache; 
      cache=""; 
      pkmn=io.readSync(file, cache, 0, 1, null); 
      if (pkmn===0){return -1;} 
     } 
    }); 
} 

fs.read code here

如果你想用一個字符串作爲「緩衝」,則必須使用傳統的接口

傳統串接口fs.read(fd, length, position, encoding, callback)

+0

好點,因爲我沒有看到,但現在我在新的緩衝區得到一個錯誤:「第一個參數需要是一個數字,數組或字符串」 – DrakaSAN

+0

雅,你需要初始化緩衝區的大小。我應該和'length'的值一樣,所以在這種情況下1.'new Buffer(1)' – travis

+0

好吧,你只需要有一個緩衝區的大小,因爲我只讀了1字節,我把新的緩衝區(1 )。我仍然有一些錯誤,但與此無關。謝謝大家! – DrakaSAN

1

沒有看到定義代碼的一部分encoding我無法準確地告訴你什麼是錯的,但encoding顯然不是一個字符串。 .toLowerCase()是String對象的一種方法。