Run function in script from command line (Node JS)

Javascriptnode.jsCommand Line

Javascript Problem Overview


I'm writing a web app in Node. If I've got some JS file db.js with a function init in it how could I call that function from the command line?

Javascript Solutions


Solution 1 - Javascript

No comment on why you want to do this, or what might be a more standard practice: here is a solution to your question.... Keep in mind that the type of quotes required by your command line may vary.

In your db.js, export the init function. There are many ways, but for example:

module.exports.init = function () {
  console.log('hi');
};

Then call it like this, assuming your db.js is in the same directory as your command prompt:

node -e 'require("./db").init()'

To other readers, the OP's init function could have been called anything, it is not important, it is just the specific name used in the question.

Solution 2 - Javascript

As per the other answers, add the following to someFile.js

module.exports.someFunction = function () {
  console.log('hi');
};

You can then add the following to package.json

"scripts": {
   "myScript": "node -e 'require(\"./someFile\").someFunction()'"
}

From the terminal, you can then call

npm run myScript

I find this a much easier way to remember the commands and use them

Solution 3 - Javascript

Update 2020 - CLI

As @mix3d pointed out you can just run a command where file.js is your file and someFunction is your function optionally followed by parameters separated with spaces

npx run-func file.js someFunction "just some parameter"

That's it.

file.js called in the example above

const someFunction = (param) => console.log('Welcome, your param is', param)

// exporting is crucial
module.exports = { someFunction }

More detailed description

Run directly from CLI (global)

Install

npm i -g run-func

Usage i.e. run function "init", it must be exported, see the bottom

run-func db.js init

or

Run from package.json script (local)

Install

npm i -S run-func

Setup

"scripts": {
   "init": "run-func db.js init"
}

Usage

npm run init

Params

Any following arguments will be passed as function parameters init(param1, param2)

run-func db.js init param1 param2

Important

the function (in this example init) must be exported in the file containing it

module.exports = { init };

or ES6 export

export { init };

Solution 4 - Javascript

Try make-runnable.

In db.js, add require('make-runnable'); to the end.

Now you can do:

node db.js init

Any further args would get passed to the init method, in the form of a list or key-value pairs.

Solution 5 - Javascript

Sometimes you want to run a function via CLI, sometimes you want to require it from another module. Here's how to do both.

// file to run
const runMe = () => {}
if (require.main === module) {
  runMe()
} 
module.exports = runMe

Solution 6 - Javascript

This one is dirty but works :)

I will be calling main() function from my script. Previously I just put calls to main at the end of script. However I did add some other functions and exported them from script (to use functions in some other parts of code) - but I dont want to execute main() function every time I import other functions in other scripts.

So I did this, in my script i removed call to main(), and instead at the end of script I put this check:

if (process.argv.includes('main')) {
   main();
}

So when I want to call that function in CLI: node src/myScript.js main

Solution 7 - Javascript

simple way:

let's say you have db.js file in a helpers directory in project structure.

now go inside helpers directory and go to node console

 helpers $ node

2) require db.js file

> var db = require("./db")

3) call your function (in your case its init())

> db.init()

hope this helps

Solution 8 - Javascript

If you turn db.js into a module you can require it from db_init.js and just: node db_init.js.

db.js:

module.exports = {
  method1: function () { ... },
  method2: function () { ... }
}

db_init.js:

var db = require('./db');

db.method1();
db.method2();

Solution 9 - Javascript

I do a IIFE, something like that:

(() => init())();

this code will be executed immediately and invoke the init function.

Solution 10 - Javascript

Updated for 2022 - If you've switched to ES Modules, you can't use the require tricks, you'd need to use dynamic imports:

node -e 'import("./db.js").then(dbMod => dbMod.init());'

or with the --experimental-specifier-resolution=node flag:

node --experimental-specifier-resolution=node -e 'import("./db").then(dbMod => dbMod.init());'

Solution 11 - Javascript

maybe this method is not what you mean, but who knows it can help

index.js
const arg = process.argv.splice(2);

function printToCli(text){
    console.log(text)
}

switch(arg[0]){
    case "--run":
        printToCli("how are you")
    break;
    default: console.log("use --run flag");
}

and run command node . --run

command line
probuss-MacBook-Air:fb_v8 probus$ node . --run
how are you
probuss-MacBook-Air:fb_v8 probus$ 

and you can add more arg[0] , arg[1], arg[2] ... and more

for node . --run -myarg1 -myarg2

Solution 12 - Javascript

Inspired by https://github.com/DVLP/run-func/blob/master/index.js

I create https://github.com/JiangWeixian/esrua

if file index.ts

export const welcome = (msg: string) => {
  console.log(`hello ${msg}`)
}

just run

esrua ./index.ts welcome -p world

will output hello world

Solution 13 - Javascript

If you want to include environment variables from your .env files, you can use env-cmd:

npx env-cmd node -e 'require("./db").init()'

If you want run a specific function in the file too, use run-func:

npx env-cmd npx run-func db.js init someArg

Or, to provide an argument for the accepted answer you'd have to do something like:

npx env-cmd node -e 'require("./db").init(someArg)'

Writing/updating an expression here is less explicit (so easier to miss when you're checking back, for example) than providing different arguments to the commands, so I recommend using env-cmd with run-func.

Note: I also usually add --experimental-modules on the end when necessary.

Solution 14 - Javascript

You can also run TypeScript with ts-node similar to @LeeGoddard answer.
In my case, I wanted to use app and init separately for testing purposes.

// app.ts

export const app = express();

export async function init(): Promise<void> {
   // app init logic...
}
npx ts-node -e 'require("./src/app").init();'
npx ts-node -e 'import("./src/app").then(a => a.init());' // esmodule

Solution 15 - Javascript

If your file just contains your function, for example:

myFile.js:

function myMethod(someVariable) {
    console.log(someVariable)
}

Calling it from the command line like this nothing will happen:

node myFile.js

But if you change your file:

myFile.js:

myMethod("Hello World");

function myMethod(someVariable) {
    console.log(someVariable)
}

Now this will work from the command line:

node myFile.js

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionwinhowesView Question on Stackoverflow
Solution 1 - JavascriptLee GoddardView Answer on Stackoverflow
Solution 2 - JavascriptGWedView Answer on Stackoverflow
Solution 3 - JavascriptPawelView Answer on Stackoverflow
Solution 4 - Javascripteye_mewView Answer on Stackoverflow
Solution 5 - JavascriptMatt KView Answer on Stackoverflow
Solution 6 - JavascriptTo KraView Answer on Stackoverflow
Solution 7 - JavascriptSiyaram MalavView Answer on Stackoverflow
Solution 8 - JavascriptDaveView Answer on Stackoverflow
Solution 9 - JavascriptNatan DeitchView Answer on Stackoverflow
Solution 10 - JavascriptchrismarxView Answer on Stackoverflow
Solution 11 - Javascriptmalik kurosakiView Answer on Stackoverflow
Solution 12 - Javascript蒋微咸View Answer on Stackoverflow
Solution 13 - JavascriptDarren ShewryView Answer on Stackoverflow
Solution 14 - JavascriptFilip SemanView Answer on Stackoverflow
Solution 15 - JavascriptBlundellView Answer on Stackoverflow