How I fixed a "cb.apply is not a function" error while using Gitbook
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.
I wrote 17 books to help you become a better developer, download them all at $0 cost by joining my newsletter
JOIN MY CODING BOOTCAMP, an amazing cohort course that will be a huge step up in your coding career - covering React, Next.js - next edition February 2025