javascript - Kör funktion i skript från kommandoraden (Node JS)


Jag skriver en webbapp i Node. Om jag har någon JS-fil db.js med en funktion init i den, hur skulle jag kunna kalla på den funktionen från kommandoraden?

Svar #1

Ingen kommentar om varför du vill göra detta, eller vad som kanske är en mer standardpraxis: här är en lösning på din fråga.... Tänk på att typen av citattecken som krävs av din kommandorad kan variera.

I din db.js, exportera init-funktionen. Det finns många sätt, men till exempel:

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

Anropa det då så här, under förutsättning att din db.js ligger i samma katalog som din kommandoprompt:

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

Om din db.js var en modul db.mjs, använd en dynamisk import för att ladda modulen:

node -e 'import("./db.mjs").then( loadedModule => loadedModule.init() )'

För andra läsare kunde OP:s init-funktion ha kallats vad som helst, det är inte viktigt, det är bara det specifika namnet som används i frågan.

Svar #2

Uppdatering 2020 - CLI

Som @mix3d påpekade kan du bara köra ett kommando där file.js är din fil och someFunction är din funktion, eventuellt följt av parametrar separerade med mellanslag

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

Det är det.

file.js anropad i exemplet ovan

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

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

Mer detaljerad beskrivning

Kör direkt från CLI (globalt)

Installera

npm i -g run-func

Användning, dvs. kör funktionen "init", den måste exporteras, se längst ner

run-func db.js init

eller

Kör från package.json-skript (lokalt)

Installera

npm i -S run-func

Installation

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

Användning

npm run init

Parametrar

Eventuella följande argument kommer att skickas som funktionsparametrar init(param1, param2)

run-func db.js init param1 param2

Viktigt

funktionen (i detta exempel init) måste exporteras i filen som innehåller den

module.exports = { init };

eller ES6-export

export { init };

Svar #3

Enligt de andra svaren, lägg till följande i someFile.js

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

Du kan sedan lägga till följande i package.json

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

Från terminalen kan du sedan kalla

npm run myScript

Jag tycker att detta är ett mycket enklare sätt att komma ihåg kommandona och använda dem

Svar #4

Försök göra körbar.

I db.js, lägg till require('make-runnable'); i slutet.

Nu kan du göra:

node db.js init

Eventuella ytterligare argument skulle skickas vidare till init-metoden, i form av en lista eller nyckel-värde-par.

Svar #5

Ibland vill du köra en funktion via CLI, ibland vill du require den från en annan modul. Här är hur du gör båda.

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

Svar #6

Den här är smutsig men fungerar :)

Jag kommer att anropa main()-funktionen från mitt skript. Tidigare lade jag bara anrop till main i slutet av skriptet. Men jag lade till några andra funktioner och exporterade dem från skriptet (för att använda funktionerna i andra delar av koden) - men jag vill inte köra main()-funktionen varje gång jag importerar andra funktioner i andra skript.

Så jag gjorde det här, i mitt skript tog jag bort anropet till main(), och istället i slutet av skriptet satte jag denna kontroll:

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

Så när jag vill kalla på den funktionen i CLI: node src/myScript.js main

Svar #7

enkelt sätt:

Låt oss säga att du har en db.js-fil i en helpers-mapp i projektstrukturen.

gå nu in i helpers-katalogen och gå till node-konsolen

 helpers $ node

2) kräver db.js-fil

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

3) kalla på din funktion (i ditt fall är det init())

> db.init()

hoppas detta hjälper

Svar #8

Om du gör db.js till en modul kan du kräva den från db_init.js och bara: node db_init.js.

db.js:

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

db_init.js:

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

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

Svar #9

Uppdaterad för 2022 - Om du har bytt till ES-moduler kan du inte använda require-tricken, du skulle behöva använda dynamiska importeringar:

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

eller med flaggan --experimental-specifier-resolution=node:

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

Relaterade artiklar