如何在使用Gitbook時解決“ cb.apply不是函數”錯誤

我經常使用Gitbook,一種小型Node.js軟件,用於從一組markdown文件生成電子書。

我在電子書中使用它。今天,我試圖生成一個PDF,運行gitbook 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-jsnpm包,是內置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
  // Older versions of Node erroneously returned signed integers for
  // 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。

免費下載我的JavaScript初學者手冊


更多js教程: