我經常使用 GitBook,這是一個小型的 Node.js 軟體,用於從一組 Markdown 檔案生成電子書。

我用它來製作我的電子書。今天在運行 gitbook pdf . 生成 PDF 時,我遇到了一個非常奇怪的錯誤:

➜ ebook git:(master) ✗ gitbook pdf .
/usr/local/lib/node\_modules/gitbook-cli/node\_modules/npm/node\_modules/graceful-fs/polyfills.js:287
if (cb) cb.apply(this, arguments)
^

TypeError: cb.apply is not a function
at /usr/local/lib/node\_modules/gitbook-cli/node\_modules/npm/node\_modules/graceful-fs/polyfills.js:287:18

cb.apply is not a function。這句話什麼意思?更重要的是,為什麼我現在出現這個錯誤?我最近沒有更新 gitbook 套件,也沒有…哦,我記得我更新了我運行的 Node.js 版本。但是我不知道為什麼這可能是問題所在。也許是吧。

不管怎樣…這個錯誤來自 /usr/local/lib/node_modules/gitbook-cli/node_modules/npm/node_modules/graceful-fs/polyfills.js 文件。這是 graceful-js npm 套件,一個「為內建的 Node.js fs 模塊提供各種改進的替代方案」,每周安裝超過 3300 萬次。

其中一個改進似乎破壞了我的工作流程,就是今天!

我沒有太多時間去找出為什麼我的 Node.js 版本會導致這個我沒有創建的應用程序和這個庫出現問題。

我打開了 /usr/local/lib/node_modules/gitbook-cli/node_modules/npm/node_modules/graceful-fs/polyfills.js 文件,這就是錯誤的來源。

這是引起問題的函數:

function statFix (orig) {
if (!orig) return orig
// 較早版本的 Node.js錯誤地為uid + gid返回了有符號整數。
return function (target, cb) {
return orig.call(fs, target, function (er, stats) {
if (!stats) return cb.apply(this, arguments)
if (stats.uid < 0) stats.uid += 0x100000000
if (stats.gid < 0) stats.gid += 0x100000000
if (cb) cb.apply(this, arguments)
})
}
}

這個函數似乎是為舊版本的 Node.js 修復的…對於我來說應該是不需要的。

我看到它在同一個文件的第 62-64 行中被使用:

fs.stat = statFix(fs.stat)
fs.fstat = statFix(fs.fstat)
fs.lstat = statFix(fs.lstat)

我注釋掉了這些行:

// fs.stat = statFix(fs.stat)
// fs.fstat = statFix(fs.fstat)
// fs.lstat = statFix(fs.lstat)

然後一切正常運作了,我能夠再次運行 gitbook 命令並得到我想要的漂亮 PDF。