Evan Hobbs
Evan Hobbs

Reputation: 3672

Pass JSON as command line argument to Node

I'd like to pass a JSON object as a command line argument to node. Something like this:

node file.js --data { "name": "Dave" }

What's the best way to do this or is there another more advisable way to do accomplish the same thing?

Upvotes: 12

Views: 21454

Answers (3)

Alexander Mills
Alexander Mills

Reputation: 100210

this works for me:

$ node foo.js --json-array='["zoom"]'

then in my code I have:

  import * as _ from 'lodash';

  const parsed = JSON.parse(cliOpts.json_array || []);

  _.flattenDeep([parsed]).forEach(item => console.log(item));

I use dashdash, which I think is the best choice when it comes to command line parsing.

To do the same thing with an object, just use:

$ node foo.js --json-object='{"bar": true}'

Upvotes: 4

user14764
user14764

Reputation: 748

This might be a bit overkill and not appropriate for what you're doing because it renders the JSON unreadable, but I found a robust way (as in "works on any OS") to do this was to use base64 encoding.

I wanted to pass around lots of options via JSON between parts of my program (a master node routine calling a bunch of small slave node routines). My JSON was quite big, with annoying characters like quotes and backslashes so it sounded painful to sanitize that (particularly in a multi-OS context).

In the end, my code (TypeScript) looks like this:

in the calling program:

const buffer: Buffer = new Buffer(JSON.stringify(myJson));
const command: string = 'node slave.js --json "' + buffer.toString('base64') + '" --b64';
const slicing: child_process.ChildProcess = child_process.exec(command, ...)

in the receiving program:

let inputJson: string;
if (commander.json) {
  inputJson = commander.json;
  if (commander.b64) {
    inputJson = new Buffer(inputJson, 'base64').toString('ascii');
  }
}

(that --b64 flag allows me to still choose between manually entering a normal JSON, or use the base64 version, also I'm using commander just for convenience)

Upvotes: 3

baao
baao

Reputation: 73251

if its a small amount of data, I'd use https://www.npmjs.com/package/minimist, which is a command line argument parser for nodejs. It's not json, but you can simply pass options like

--name=Foo 

or

-n Foo

I think this is better suited for a command line tool than json.

If you have a large amount of data you want to use you're better of with creating a json file and only pass the file name as command line argument, so that your program can load and parse it then.

Big objects as command line argument, most likely, aren't a good idea.

Upvotes: 5

Related Questions