web-dev-qa-db-fra.com

Exécuter la fonction dans le script à partir de la ligne de commande (Node JS)

J'écris une application web dans Node. Si j'ai un fichier JS db.js avec une fonction init, comment pourrais-je appeler cette fonction à partir de la ligne de commande?

148
winhowes

Pas de commentaire sur la raison pour laquelle vous voulez faire cela, ou sur ce qui pourrait être une pratique plus standard: voici une solution à votre question .... Gardez à l'esprit que le type de guillemets requis par votre ligne de commande peut varier.

Dans votre db.js, exportez la fonction init. Il y a beaucoup de façons, mais par exemple:

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

Appelez-le ensuite ainsi, en supposant que votre db.js se trouve dans le même répertoire que votre invite de commande:

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

Pour d'autres lecteurs, la fonction init du PO aurait pu s'appeler n'importe quoi, ce n'est pas important, c'est juste le nom spécifique utilisé dans la question.

229
LeeGee

Comme dans les autres réponses, ajoutez ce qui suit à someFile.js

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

Vous pouvez ensuite ajouter ce qui suit à package.json

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

Depuis le terminal, vous pouvez alors appeler

npm run myScript

Je trouve que c'est un moyen beaucoup plus facile de se souvenir des commandes et de les utiliser

30
Gaz_Edge

Essayez make-runnable .

Dans db.js, ajoutez require('make-runnable'); à la fin.

Maintenant vous pouvez faire:

node db.js init

Tout argument supplémentaire serait passé à la méthode init.

24
eye_mew

Installez run-func sur votre projet

npm i -D run-func

Exécuter n'importe quelle fonction exportée

run-func db.js init

Tous les arguments suivants seront passés en tant que paramètres de fonction init(param1, param2)

run-func db.js init param1 param2

Cela peut également être exécuté à partir de la section "scripts" de package.json.

"db-init": "run-func db.js init"

Important la fonction (dans cet exemple init) doit être exportée dans le fichier la contenant

module.exports = { init };

ou exportation ES6

export { init };
9
Pawel

manière simple:

disons que vous avez le fichier db.js dans un répertoire helpers dans la structure du projet.

maintenant aller dans le répertoire helpers et aller à la console du noeud

 helpers $ node

2) nécessite un fichier db.js

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

3) appelez votre fonction (dans votre cas, son init ())

> db.init()

j'espère que cela t'aides

6
Siyaram Malav

Si vous transformez db.js en un module, vous pouvez le demander à db_init.js et juste: node db_init.js.

db.js:

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

db_init.js:

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

db.method1();
db.method2();
4
Dave

Celui-ci est sale mais fonctionne :)

J'appellerai la fonction main() de mon script. Auparavant, je venais de mettre les appels à main à la fin du script. Cependant, j’ai ajouté quelques autres fonctions et les ai exportées depuis le script (pour utiliser des fonctions dans d’autres parties du code) - mais je ne veux pas exécuter la fonction main () chaque fois que j’importe d’autres fonctions dans d’autres scripts.

Donc j'ai fait ceci, dans mon script j'ai enlevé l'appel à main (), et à la place à la fin du script j'ai mis cette vérification:

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

Alors, quand je veux appeler cette fonction dans la CLI: node src/myScript.js main

3
To Kra

Je fais un IIFE, quelque chose comme ça:

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

ce code sera exécuté immédiatement et invoquera la fonction init.

2
Natan Deitch