Skip to content

How I fixed a "cb.apply is not a function" error while using Gitbook

New Course Coming Soon:

Get Really Good at Git

I regularly use Gitbook, a little Node.js software used to generate an ebook from a set of markdown files.

I use it for my ebooks. Today I was trying to generate a PDF, running gitbook pdf ., when I got a really weird error:

  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. What does this even mean? And most importantly, why do I have this error now? I didn’t update the gitbook package recently, and I didn’t… Oh I think I updated the Node.js version I run. But I have no idea why this should be the problem. Maybe it is.

Anyway.. the error comes from the /usr/local/lib/node_modules/gitbook-cli/node_modules/npm/node_modules/graceful-fs/polyfills.js file. This is the graceful-js npm package, a “drop-in replacement for the built-in Node.js fs module, making various improvements”, installed over 33 million times a week.

One of those improvements seems to break my workflow, today!

I don’t have a lot of time free to find out why my Node.js version gives problems with this application I didn’t create and this library.

I opened the file /usr/local/lib/node_modules/gitbook-cli/node_modules/npm/node_modules/graceful-fs/polyfills.js, where the error comes from.

Here’s the function that gives the problem:

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)
    })
  }
}

This seems to fix something in older version of Node.js.. it shouldn’t be needed for me.

I see it’s being used in lines 62-64 of the same file:

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

I commented out those lines:

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

and everything worked fine, I was able to run the gitbook command again, and I got my nice PDF.

Are you intimidated by Git? Can’t figure out merge vs rebase? Are you afraid of screwing up something any time you have to do something in Git? Do you rely on ChatGPT or random people’s answer on StackOverflow to fix your problems? Your coworkers are tired of explaining Git to you all the time? Git is something we all need to use, but few of us really master it. I created this course to improve your Git (and GitHub) knowledge at a radical level. A course that helps you feel less frustrated with Git. Launching Summer 2024. Join the waiting list!
→ Get my JavaScript Beginner's Handbook
→ Read my JavaScript Tutorials on The Valley of Code
→ Read my TypeScript Tutorial on The Valley of Code

Here is how can I help you: