Führen Sie die Funktion im Skript über die Befehlszeile aus (Node JS).

204

Ich schreibe eine Web-App in Node. Wenn ich eine JS-Datei db.jsmit einer Funktion initdarin habe, wie kann ich diese Funktion über die Befehlszeile aufrufen?

winhowes
quelle
Verwenden Sie npm run- func stackoverflow.com/a/43598047/696535
Pawel
3
@Pawel Ich bevorzuge die akzeptierte Antwort, da keine Drittanbieterabhängigkeit installiert werden muss, die entweder die Unterstützung verliert oder Schwachstellen enthält. Es ist ein Risiko, das Sie mit Abhängigkeiten eingehen. Daher ist es immer eine gute Idee, Abhängigkeiten auf gut überprüfte und gepflegte zu beschränken.
Winhowes
Sie können auch das Paket npmjs.com/package/invoke-script
Stefan van de Vooren vom

Antworten:

329

Kein Kommentar dazu, warum Sie dies tun möchten oder was eine Standardpraxis sein könnte: Hier ist eine Lösung für Ihre Frage ... Beachten Sie, dass die Art der Anführungszeichen, die für Ihre Befehlszeile erforderlich sind, variieren kann.

db.jsExportieren Sie in Ihrem die initFunktion. Es gibt viele Möglichkeiten, aber zum Beispiel:

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

Rufen Sie es dann so auf, vorausgesetzt, Sie db.jsbefinden sich im selben Verzeichnis wie Ihre Eingabeaufforderung:

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

Für andere Leser hätte die initFunktion des OP alles heißen können, es ist nicht wichtig, es ist nur der spezifische Name, der in der Frage verwendet wird.

LeeGee
quelle
80
Dies war ein nützlicher Tipp zum Testen von Javascript, das von AWS Lambda ausgeführt wurde - danke
Alex Hinton
14
Was passiert, wenn die Funktion asynchron ist?
Augustin Riedinger
24
Falls jemand anderes versucht, dies in seiner package.json als npm-Skript zu tun, habe ich es mit einfachen und doppelten Anführungszeichen versucht, aber es hat nicht funktioniert, bis ich sie gewechselt habe: "start": "node - e "require ('./ server') ()",
Sako73
2
Danke @winhowes für deine Antwort, ich habe nur dein Beispiel verwendet module.exports.init = function () { console.log('hi'); };und node -e 'require("./db").init()'irgendwie nicht für mich gearbeitet. Ich bin mir nicht sicher, was ich falsch gemacht habe, aber indem ich Ihrer Idee gefolgt bin, habe ich sie verwendet module.exports = myFunction, und dann node -e 'require("./myFunction")()'für mich gearbeitet.
C.Lee
3
Als Ergänzung zu @ AlexHintons Kommentar verwende ich jetzt Folgendes, um ein Ereignis und den Rückruf nachzuahmen : node -e 'require("./index").handler(require("./fixtures/sample_event_01.json"), {}, console.log)'. Die Mitte {}wäre der Kontext, zögern Sie nicht, sich anzupassen. Auch console.log ist ein bisschen primitiv, aber ein guter Anfang. Natürlich können Sie auch eine dedizierte CLI.js schreiben, für die wiederum () der index.js / handler erforderlich ist, wie in anderen Kommentaren angegeben.
Adrian Föder
50

Fügen Sie gemäß den anderen Antworten Folgendes hinzu: someFile.js

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

Sie können dann Folgendes hinzufügen package.json

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

Vom Terminal aus können Sie dann anrufen

npm run myScript

Ich finde es viel einfacher, sich die Befehle zu merken und sie zu verwenden

Gaz_Edge
quelle
Auf meinem Win10-Computer gibt diese Syntax einfach das Skript wieder (entweder in einem PowerShell- oder einem Eingabeaufforderungsterminal). Wenn Sie es direkt anstatt über 'npm run' ausführen, wird 'Unexpected token' ausgegeben, das auf den Anfang des erforderlichen Parameters zeigt. Ich habe noch nicht herausgefunden, wie es funktioniert.
CalvinDale
@CalvinDale hier gleich, außer dass ich das Skript selbst in Powershell ausführen kann.
Ferr
3
Auf meinem Computer (Windows 10) musste ich die doppelten und einfachen Anführungszeichen wie folgt umschalten: "myScript": "node -e \" require ('./ someFile'). SomeFunction () \ "" Andernfalls würde Node Drucken Sie den Befehl einfach in einfachen Anführungszeichen aus, aber bewerten Sie ihn nicht. Vielleicht löst dies die Probleme von @CalvinDale und Ferr.
Christoph
3
Was ist, wenn wir dem Funktionsaufruf ein Argument hinzufügen möchten?
Miguel Stevens
26

Versuchen Sie es mit make-runnable .

Fügen Sie in db.js require('make-runnable');das Ende hinzu.

Jetzt können Sie tun:

node db.js init

Alle weiteren Argumente würden an die initMethode übergeben.

eye_mew
quelle
16

Direkt von der CLI ausführen (global)

Installieren

npm i -g run-func

Verwendung dh Ausführungsfunktion "init", muss exportiert werden, siehe unten

run-func db.js init

oder

Führen Sie das Skript package.json aus (lokal).

Installieren

npm i -S run-func

Konfiguration

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

Verwendung

npm run init

Params

Alle folgenden Argumente werden als Funktionsparameter übergeben init(param1, param2)

run-func db.js init param1 param2

Wichtig

Die Funktion (in diesem Beispiel init) muss in die Datei exportiert werden, die sie enthält

module.exports = { init };

oder ES6-Export

export { init };
Pawel
quelle
Ich dachte daran, den Vorschlag von eye_mew zu verwenden make-runnable, aber das ist viel besser, denke ich. Vielen Dank.
Luis.espinal
@ luis.espinal Ich bin froh, dass Sie dies nützlich finden. Es gibt weniger Magie im Hintergrund und keine Notwendigkeit, Dateien zu ändern. Wenn eine Funktion nicht exportiert wird, muss sie es sein, aber das ist logisch sinnvoll, genau wie normale ES6-Module und deren Import / Export.
Pawel
das funktioniert bei mir nicht; $ run-func db.js init bash: run-func: Befehl nicht gefunden
Patlatus
@Patlatus zur direkten Verwendung von CLI ohne Skript in package.json global installierennpm i -g run-func
Pawel
@Patlatus tatsächlich gab es einen Fehler, der nur erlaubte, dass dies in package.json-Skripten ausgeführt wurde. Ich habe eine neue Version hochgeladen, die das Problem behebt und auch global funktioniert
Pawel
9

einfacher Weg:

Angenommen, Sie haben die Datei db.js in einem Hilfeverzeichnis in der Projektstruktur.

Gehen Sie jetzt in das Helfer-Verzeichnis und zur Knotenkonsole

 helpers $ node

2) erfordern die Datei db.js.

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

3) Rufen Sie Ihre Funktion auf (in Ihrem Fall ihre init ())

> db.init()

hoffe das hilft

Siyaram Malav
quelle
7

Wenn Sie sich db.jsin ein Modul verwandeln , können Sie es von db_init.jsund nur verlangen : node db_init.js.

db.js:

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

db_init.js:

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

db.method1();
db.method2();
Dave
quelle
7

Dieser ist schmutzig, funktioniert aber :)

Ich werde die main()Funktion aus meinem Skript aufrufen . Zuvor habe ich am Ende des Skripts nur main aufgerufen. Ich habe jedoch einige andere Funktionen hinzugefügt und sie aus dem Skript exportiert (um Funktionen in einigen anderen Teilen des Codes zu verwenden) - aber ich möchte die main () - Funktion nicht jedes Mal ausführen, wenn ich andere Funktionen in andere Skripte importiere.

Also habe ich dies getan, in meinem Skript habe ich den Aufruf von main () entfernt und stattdessen am Ende des Skripts diese Prüfung durchgeführt:

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

Wenn ich diese Funktion in der CLI aufrufen möchte: node src/myScript.js main

Zu Kra
quelle
5

Ich mache ein IIFE, so ähnlich:

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

Dieser Code wird sofort ausgeführt und ruft die Init-Funktion auf.

Natan Deitch
quelle
2
Aber wenn Sie ausführen: node init.jsund die Datei ein IIFE enthält, wird es funktionieren. Ich glaube, ich habe Ihre Frage nicht vollständig verstanden. Es tut uns leid.
Natan Deitch
Verstehe das total, aber wenn der Code andere Funktionen enthält, können sie aufgerufen werden oder nicht
winhowes
Sie können es sogar vereinfachen, (init)();wenn Sie wollen :)
Little doe
1

Manchmal möchten Sie eine Funktion über die CLI ausführen, manchmal möchten Sie requiresie von einem anderen Modul aus ausführen . Hier erfahren Sie, wie Sie beides tun.

// file to run
const runMe = () => {}
if (require.main === module) {
  runMe()
} 
module.exports = runMe
Matt K.
quelle
-2

Einfach, in der Javascript-Datei testfile.js:

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

Laufen an der Eingabeaufforderung:

node testfile.js
Elton da Nobrega Mascena
quelle
4
Sicher, damit können Sie eine JS-Datei ausführen. Die ursprüngliche Frage besteht darin, eine bestimmte Funktion in dieser Datei aufzurufen, ohne den test
Dateifluss
-3

Wenn Ihre Datei nur Ihre Funktion enthält, zum Beispiel:

myFile.js:

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

Wenn Sie es über die Befehlszeile so aufrufen, geschieht nichts:

node myFile.js

Aber wenn Sie Ihre Datei ändern:

myFile.js:

myMethod("Hello World");

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

Dies funktioniert nun über die Befehlszeile:

node myFile.js
Blundell
quelle
1
Sicher, so wird eine JS-Datei ausgeführt. Die Frage zielte eher darauf ab, ob ich eine bestimmte Funktion (aus vielen möglichen Funktionen) ausführen konnte, bei der die einzige Änderung die Befehlszeileneingabe und nicht die JS-Datei selbst pro Funktionsaufruf war
winhowes
Dies hat nichts mit dem Szenario zu tun, nach dem die Person fragt
Jobmo
@jobmo ist es, sie wollen eine Methode von der cmd-Zeile ausführen, das macht das. (Ich bin hierher gekommen, indem ich die Frage selbst gegoogelt habe, damit jemand anderes die Antwort zu schätzen weiß.) Keine Sorge, es gibt verschiedene Antworten, bei denen Sie die Wahl haben dürfen
Blundell,
Genau geht es darum, eine Methode über die cmd-Zeile auszuführen. In dieser Antwort wird myFile.js ausgeführt. Es wird keine Funktion ausgeführt. Es kommt dann vor, dass die Datei eine Funktion hat und die Funktion innerhalb der Datei aufgerufen wird. Das war mein Punkt.
Jobmo
Sie haben gerade erklärt, dass die Antwort die Funktion über die Befehlszeile ausführt: +1:
Blundell