Uruchom funkcję w skrypcie z wiersza poleceń (węzeł JS)


204

Piszę aplikację internetową w węźle. Jeśli mam plik JS db.jsz funkcją init, jak mogę wywołać tę funkcję z wiersza poleceń?



3
@Pawel Wolę zaakceptowaną odpowiedź, ponieważ nie wymaga instalowania zależności strony trzeciej, która może albo stracić wsparcie lub zawierać luki w zabezpieczeniach. Ryzyko jest uzależnione od dowolnej zależności, więc ograniczenie zależności do dobrze sprawdzonych i utrzymywanych jest zawsze dobrym pomysłem.
winhowes

Możesz także skorzystać z pakietu npmjs.com/package/invoke-script
Stefan van de Vooren

Odpowiedzi:


329

Bez komentarza na temat tego, dlaczego chcesz to zrobić, ani na temat bardziej standardowej praktyki: oto rozwiązanie twojego pytania ... Pamiętaj, że rodzaj cudzysłowu wymagany w wierszu poleceń może się różnić.

W twoim db.jswyeksportuj initfunkcję. Istnieje wiele sposobów, ale na przykład:

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

Następnie nazwij to w następujący sposób, zakładając, że Twój plik db.jsznajduje się w tym samym katalogu co wiersz polecenia:

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

Dla innych czytelników funkcję OP initmożna było nazwać czymkolwiek, to nie jest ważne, to tylko konkretna nazwa użyta w pytaniu.


80
To była przydatna wskazówka do testowania jakiegoś javascript, który działał z AWS lambda - dzięki
Alex Hinton

14
Co się stanie, jeśli funkcja będzie asynchroniczna?
Augustin Riedinger

24
W przypadku, gdy ktoś inny próbuje to zrobić w pakiecie.json jako skrypt npm, próbowałem z pojedynczymi cudzysłowami i podwójnymi cudzysłowami w środku, ale nie działało to dopóki ich nie zmieniłem: „start”: „node - e \ "wymagają ('./ serwer') () \" ",
Sako73

2
Dzięki @winhowes za odpowiedź, właśnie użyłem twojego przykładu module.exports.init = function () { console.log('hi'); };I node -e 'require("./db").init()'jakoś mi nie działało. Nie jestem pewien, co zrobiłem źle, ale podążając za twoim pomysłem, wykorzystałem module.exports = myFunction, , a potem node -e 'require("./myFunction")()'pracowałem dla siebie.
C. Patrz

3
jako powiększania do @ komentarzu AlexHinton za, ja teraz używać następujących do mimick zdarzenia oraz oddzwanianie: node -e 'require("./index").handler(require("./fixtures/sample_event_01.json"), {}, console.log)'. Środek {}będzie kontekstem, możesz się dostosować. Również console.log jest nieco prymitywny, ale dobry początek. Oczywiście możesz także napisać dedykowany plik CLI.js, który z kolei wymaga () indeksu.js / handler, jak podano w innych komentarzach.
Adrian Föder

50

Podobnie jak w przypadku innych odpowiedzi, dodaj do someFile.js

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

Następnie możesz dodać następujące elementy package.json

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

Z terminala możesz następnie zadzwonić

npm run myScript

Uważam, że jest to o wiele łatwiejszy sposób zapamiętywania poleceń i ich używania


Na moim komputerze z Win10 ta składnia po prostu przypomina skrypt (w terminalu PowerShell lub wierszu polecenia). Uruchamianie go bezpośrednio zamiast przez „npm run” wyrzuca „Nieoczekiwany token” wskazujący na początek parametru wymaganego. Jeszcze nie wymyśliłem, jak to zrobić.
CalvinDale

@CalvinDale to samo tutaj, z tym wyjątkiem, że sam mogę uruchomić skrypt w PowerShell.
ferr

3
Na moim komputerze (Windows 10) musiałem przełączać podwójne i pojedyncze cudzysłowy, w ten sposób: „myScript”: „węzeł -e \” wymaga ('./ someFile'). SomeFunction () \ "" W przeciwnym razie Węzeł po prostu wydrukuj polecenie w cudzysłowie, ale nie oceniaj go. Może to rozwiązuje problemy @CalvinDale i ferr.
Christoph

3
Co jeśli chcemy dodać argument do wywołania funkcji?
Miguel Stevens

26

Spróbuj uruchomić .

W db.js dodaj require('make-runnable');na końcu.

Teraz możesz zrobić:

node db.js init

Wszelkie dalsze argumenty zostaną przekazane do initmetody.


16

Uruchom bezpośrednio z CLI (globalnie)

zainstalować

npm i -g run-func

Użycie, tzn. Uruchomienie funkcji „init”, należy ją wyeksportować, patrz na dole

run-func db.js init

lub

Uruchom ze skryptu package.json (lokalny)

zainstalować

npm i -S run-func

Ustawiać

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

Stosowanie

npm run init

Params

Wszelkie następujące argumenty zostaną przekazane jako parametry funkcji init(param1, param2)

run-func db.js init param1 param2

Ważny

funkcja (w tym przykładzie init) musi zostać wyeksportowana do pliku zawierającego ją

module.exports = { init };

lub eksport ES6

export { init };

Myślałem, że skorzystam z sugestii eye_mew make-runnable, ale myślę , że jest to o wiele lepsze. Dzięki.
luis.espinal

@ luis.espinal Cieszę się, że uznasz to za przydatne. W tle jest mniej magii i nie trzeba modyfikować plików. O ile funkcja nie jest eksportowana, musi być, ale ma to logiczny sens, podobnie jak zwykłe moduły ES6 i ich import / eksport.
Paweł

to nie działa dla mnie; $ run-func db.js init bash: run-func: nie znaleziono polecenia
Patlatus

@Patlatus, aby używać bezpośrednio z interfejsu CLI bez skryptu w pakiecie.json, zainstaluj go globalnienpm i -g run-func
Paweł

@Patlatus faktycznie występował błąd, który pozwalał na uruchamianie go tylko w skryptach package.json. Przesłałem nową wersję, która to naprawia i działa również globalnie
Paweł

9

prosta droga:

załóżmy, że masz plik db.js w katalogu helpers w strukturze projektu.

teraz przejdź do katalogu helpers i przejdź do konsoli węzła

 helpers $ node

2) wymagają pliku db.js

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

3) wywołaj swoją funkcję (w twoim przypadku jej init ())

> db.init()

mam nadzieję że to pomoże


7

Jeśli z kolei db.jsdo modułu można wymagać to od db_init.jsi tylko: node db_init.js.

db.js:

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

db_init.js:

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

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

7

Ten jest brudny, ale działa :)

Będę wywoływał main()funkcję z mojego skryptu. Wcześniej po prostu wstawiałem wywołania main na końcu skryptu. Dodałem jednak kilka innych funkcji i wyeksportowałem je ze skryptu (aby użyć funkcji w niektórych innych częściach kodu) - ale nie chcę wykonywać funkcji main () za każdym razem, gdy importuję inne funkcje w innych skryptach.

Zrobiłem to, w swoim skrypcie usunąłem wywołanie funkcji main (), a zamiast tego na końcu skryptu sprawdziłem:

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

Więc kiedy chcę wywołać tę funkcję w CLI: node src/myScript.js main


5

Robię IIFE, coś takiego:

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

ten kod zostanie wykonany natychmiast i wywoła funkcję init.


2
Ale jeśli uruchomisz: node init.jsa plik zawiera IIFE, będzie działać. Myślę, że nie do końca zrozumiałem twoje pytanie. Przepraszam.
Natan Deitch

Zupełnie to rozumiem, ale jeśli kod zawiera inne funkcje, można je
wywołać

Możesz nawet to uprościć, (init)();jeśli chcesz :)
Mała łania

1

Czasami chcesz uruchomić funkcję przez CLI, czasem chcesz requirez innego modułu. Oto jak to zrobić.

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

-2

Proste, w pliku javascript testfile.js:

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

Uruchamianie po monicie:

node testfile.js

4
Jasne, pozwala to uruchomić plik JS. Pierwotne pytanie dotyczy wywołania określonej funkcji w tym pliku bez zmiany przepływu pliku (w twoim przykładzie testjest uruchamiany za każdym razem, więc musisz zmienić plik, aby wywołać inną funkcję)
winhowes

-3

Jeśli plik zawiera tylko funkcję, na przykład:

myFile.js:

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

Wywołanie go z wiersza poleceń w ten sposób nic się nie wydarzy:

node myFile.js

Ale jeśli zmienisz plik:

myFile.js:

myMethod("Hello World");

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

Teraz będzie to działać z wiersza poleceń:

node myFile.js

1
Jasne, tak można uruchomić plik JS. Pytanie było bardziej ukierunkowane na to, czy mogę uruchomić określoną funkcję (spośród wielu możliwych funkcji), w której jedyną zmianą było wejście w wierszu poleceń, a nie sam plik JS na wywołanie funkcji
winhowes

To nie dotyczy scenariusza, o który prosi dana osoba
jobmo

@jobmo to jest, oni chcą uruchomić metodę z linii cmd, to robi. (dotarłem tutaj, szukając odpowiedzi na pytanie, więc ktoś inny może docenić odpowiedź), nie martw się, istnieje różnorodny zestaw odpowiedzi, które możesz wybrać
Blundell

Dokładnie pytanie dotyczy uruchomienia metody z linii cmd. W tej odpowiedzi plik myFile.js jest wykonywany. Nie wykonuje żadnej funkcji. Zdarza się, że plik ma funkcję i funkcja jest wywoływana w pliku. To był mój cel.
jobmo

Właśnie wyjaśniłeś, że odpowiedź wykonuje funkcję z wiersza poleceń: +1:
Blundell
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.