markdown-pdf icon indicating copy to clipboard operation
markdown-pdf copied to clipboard

TypeError [ERR_INVALID_ARG_TYPE]: The "file" argument must be of type string. Received null

Open ORESoftware opened this issue 2 years ago • 9 comments

here was my command:

markdown-pdf report-paper-3.md -o $(uuidgen)

I got this error

node:internal/validators:120
    throw new ERR_INVALID_ARG_TYPE(name, 'string', value);
    ^

TypeError [ERR_INVALID_ARG_TYPE]: The "file" argument must be of type string. Received null
    at new NodeError (node:internal/errors:372:5)
    at validateString (node:internal/validators:120:11)
    at normalizeSpawnArguments (node:child_process:505:3)
    at spawn (node:child_process:693:13)
    at Object.execFile (node:child_process:327:17)
    at WriteStream.<anonymous> (/Users/amills/.nvm/versions/node/v16.15.0/lib/node_modules/markdown-pdf/index.js:117:22)
    at WriteStream.emit (node:events:539:35)
    at finish (node:internal/streams/writable:754:10)
    at finishMaybe (node:internal/streams/writable:739:9)
    at afterWrite (node:internal/streams/writable:504:3) {
  code: 'ERR_INVALID_ARG_TYPE'
}

the error makes no sense to me :( :(

ORESoftware avatar Sep 13 '22 17:09 ORESoftware

Having a similar error, I found that the code is not able to locate a phantomjs. So installing phantomjs-prebuilt fixed the issue for me.

ZloeSabo avatar Sep 28 '22 19:09 ZloeSabo

Installing phantomjs-prebuilt didn't fix the issue for me. :-(

onekiloparsec avatar Oct 13 '22 12:10 onekiloparsec

I can confirm that the solution by @ZloeSabo did not help in my case either. I'm a Node newbie, but here's the reproducible example (running on Docker image node:latest)

npm install -g markdown-pdf --ignore-scripts
npm install -g phantomjs-prebuilt
cd /tmp
git clone https://github.com/alanshaw/markdown-pdf
cd markdown-pdf
markdown-pdf README.md

which yields

node:internal/validators:163
    throw new ERR_INVALID_ARG_TYPE(name, 'string', value);
    ^

TypeError [ERR_INVALID_ARG_TYPE]: The "file" argument must be of type string. Received null
    at new NodeError (node:internal/errors:393:5)
    at validateString (node:internal/validators:163:11)
    at normalizeSpawnArguments (node:child_process:538:3)
    at spawn (node:child_process:736:13)
    at Object.execFile (node:child_process:341:17)
    at WriteStream.<anonymous> (/usr/local/lib/node_modules/markdown-pdf/index.js:117:22)
    at WriteStream.emit (node:events:525:35)
    at finish (node:internal/streams/writable:748:10)
    at finishMaybe (node:internal/streams/writable:733:9)
    at afterWrite (node:internal/streams/writable:507:3) {
  code: 'ERR_INVALID_ARG_TYPE'
}

Node.js v18.11.0

Glad to try and help with debugging, but I'm normally useless on Node.

System:

  • Linux as host
  • node:latest ea9021b35904
  • Docker version 20.10.17-ce, build a89b84221c85

larsvilhuber avatar Oct 16 '22 15:10 larsvilhuber

It worked for me after installing phantomjs-prebuilt and passing the path to the phantomjs.exe as the --phantom-path parameter.

Example:

markdown-pdf my-file.md --out my-file.pdf --phantom-path ...\node_modules\phantomjs-prebuilt\lib\phantom\bin\phantomjs.exe

ronaldbosma avatar Oct 22 '22 13:10 ronaldbosma

Getting this error

% npm install -g phantomjs-prebuilt
npm WARN deprecated [email protected]: this package is now deprecated

and it is still not working.

animator avatar Oct 24 '22 14:10 animator

I added export OPENSSL_CONF=/etc/ssl/ prior to running this as

markdown-pdf README.md --out test.pdf

and I no longer have errors.

larsvilhuber avatar Oct 24 '22 15:10 larsvilhuber

I had to supply both:

OPENSSL_CONF=/etc/ssl markdown-pdf \
  --phantom-path "${NODE_MODULES_DIR}/phantomjs-prebuilt/lib/phantom/bin/phantomjs" \
  --out test.pdf
  README.md

lucastheisen avatar Dec 10 '22 21:12 lucastheisen

The reason can't find file is markdown-pdf index.js line 17

  opts.phantomPath = opts.phantomPath || require('phantomjs-prebuilt').path

system can't find path by require function

So we intall the phantomjs-prebuilt by npm install phantomjs-prebuilt After that, the problem maybe still happen, but now we can see the .path is from code in file node_modules\phantomjs-prebuilt\lib\phantomjs.js

/**
 * Where the phantom binary can be found.
 * @type {string}
 */
try {
  var location = require('./location')
  exports.path = path.resolve(__dirname, location.location)
  exports.platform = location.platform
  exports.arch = location.arch
} catch(e) {
  // Must be running inside install script.
  exports.path = null
}

We can see if the code can not work normally, the path will be null. What we need to do is just run install.js, i.e. shell node ./install.js

which can check in file README.md Then it can generate as you wish without any parameter.

Inouyasha avatar Feb 20 '23 08:02 Inouyasha

Having a similar error, I found that the code is not able to locate a phantomjs. So installing phantomjs-prebuilt fixed the issue for me.

Uninstall markdown-pdf first, then install phantomjs-prebuilt and markdown-pdf solved this in my environment.

Steve235lab avatar May 26 '24 08:05 Steve235lab