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());'
