Back to blog

Handling Command Line Arguments in Node

·1 min read

When running a script in a programming language, you have the ability to pass along command line arguments (which can change the functionality of the script upon each run). In node, we can access command line arguments through process.argv, which is an array:

javascript
console.log(process.argv)

/*
  [
    '/Users/drew/.nvm/versions/node/v18.16.0/bin/node',
    '/Users/drew/Dev/getThere/src/scraper/scraper.js'
  ]
*/

The the 0th element is the node interpreter and the 1st element is the name of the script. From the 2nd element on, we can grab command line arguments we pass. For instance, say we run node ./scraper.js fakeCommandLineArgument.

javascript
console.log(process.argv)

/*
  [
    '/Users/drew/.nvm/versions/node/v18.16.0/bin/node',
    '/Users/drew/Dev/getThere/src/scraper/scraper.js',
    'fakeCommandLineArgument'
  ]
*/

We can then grab our command line argument with process.argv[2]. But, this isn’t ideal since the position matters. It would be better if we could pass command line arguments in a manner we’re used to in the CLI like so: node ./scraper.js --sourceCity=SFO. We can manually write some functions to parse out the arguments and give them back to use, but there’s already a nice library called commander that does that for us. So, let’s use that.

javascript
const { program } = require("commander")

program
  .option("-s, --sourceCity <city>", "City to start from")
  .option("-d, --destinationCity <city>", "City to end in")
program.parse()

console.log(program.opts())
// { sourceCity: "SFO", destinationCity: "JFK" }

Now if we run node ./scraper.js --sourceCity=SFO --destinationCity=JFK

We’ll get back { sourceCity: "SFO", destinationCity: "JFK" } in program.opts(). Sweet.

If we want to make these required, thus throwing an error if they are not present, we can use requiredOption:

javascript
const { program } = require("commander")

program
  .requiredOption("-s, --sourceCity <city>", "City to start from")
  .requiredOption("-d, --destinationCity <city>", "City to end in")
program.parse()

console.log(program.opts())

If we were to run this without either the sourceCity or the destinationCity, an error would be thrown:

bash
error: required option '-s, --sourceCity <city>' not specified

Accepting command line arguments can make your scripts more flexible and usable. If you’re using them, throw in commander to provide command line argument parsing and basic presence validation so you can move forward on solving awesome problems instead of manually parsing out command line arguments.