工作中有一個需求是手動維護一個路由檔案(項目太大,該檔案隻維護關鍵内容--name/key/children),通過node讀取該檔案内容,設定想要的格式并輸出到最終路由檔案。通過指令行運作node即可生成檔案内容。
由于項目太大,手動維護檔案一直在不停地往裡面添加路由關鍵資訊。直到有一天,同僚告訴我無法運作node指令,報錯!!!
經過一番問題排查,初步判定可能是因為檔案太大了。列印生成内容發現傳回的是undefind。
前幾次列印createReadStream中on('data')的data值都發現能通路到結尾,于是,以為是fs.wirteFile()的問題。然後,我在網上查詢說需要createReadStream、createWriteStream讀寫大檔案。于是,我準備采用createWriteStream。
結果,問題又來了!!!createReadStream讀取的内容不全了。
好吧!隻能又在網上去查詢關于createReadStream讀取内容不全的問題。經過網上多方的資料查詢發現,createReadStream在讀取檔案時,每次都會讀取一定長度的内容,也就是說,這個會有大小限制。
于是,我又去官網檢視API,發現:createReadStream傳回的流(
highWaterMark
)的預設大小是 64 kb 。我傳回目錄看了一下檔案大小是66Kb!!!好吧,我明白了!
fs.createReadStream(path, { highWaterMark: 100 * 1024 })
這下該夠了吧?去重新運作了一下,嘿,可以了!!!
雖然代碼改動不大,也還是花費了我将近一個小時才找到原因,并解決!也算是一個經驗了!