Запустити функцію в сценарії з командного рядка (Node JS)


204

Я пишу веб-додаток у Node. Якщо у мене є якийсь файл JS db.jsз функцією initв ньому, як я можу викликати цю функцію з командного рядка?


використовувати npm run-func stackoverflow.com/a/43598047/696535
Pawel

3
@Pawel Я вважаю за краще прийнятий відповідь, оскільки він не вимагає встановлення сторонніх залежностей, які можуть або втратити підтримку, або містити вразливості. Це ризик, з яким ви стикаєтесь із будь-якою залежністю, тому обмеження залежностей на добре перевірених та підтримуваних завжди є хорошою ідеєю.
winhowes

Ви також можете використовувати пакет npmjs.com/package/invoke-script
Стефан ван де Воорен

Відповіді:


329

Не коментуйте, чому ви хочете це зробити, або що може бути більш стандартною практикою: ось рішення вашого питання .... Майте на увазі, що тип лапок, необхідних для вашого командного рядка, може відрізнятися.

У своєму db.jsекспорті initфункцію. Існує багато способів, але наприклад:

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

Потім зателефонуйте так, припускаючи, що ваш файл db.jsзнаходиться в тому ж каталозі, що і ваш командний рядок:

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

Іншим читачам функцію ОП initможна було назвати чим завгодно, це не важливо, це лише конкретна назва, що використовується у питанні.


80
Це була корисна порада для тестування деяких javascript, які працювали від лямбда AWS - спасибі
Алекс Хінтон

14
Що станеться, якщо функція асинхронізована?
Августин Рідінгер

24
У випадку, якщо хтось інший намагається зробити це у своєму пакеті.json як сценарій npm, я спробував це з єдиними цитатами та подвійними лапками всередині, але це не спрацювало, поки я не переключив їх: "start": "node - е \ "вимагати ('./ сервер') () \" ",
Sako73

2
Дякую @winhowes за вашу відповідь, я просто використовував ваш приклад module.exports.init = function () { console.log('hi'); };І node -e 'require("./db").init()'не працював для мене якось. Я не впевнений, що я зробив не так, але, дотримуючись вашої ідеї, я використав module.exports = myFunction, , а потім node -e 'require("./myFunction")()'працював на мене.
C.Lee

3
як збільшення на @ коментарі AlexHinton, я тепер використовувати таку обставину наслідувати і зворотний виклик: node -e 'require("./index").handler(require("./fixtures/sample_event_01.json"), {}, console.log)'. Середина {}буде контекстом, не соромтеся коригувати. Також console.log трохи примітивний, але приємний початок. Звичайно, ви також можете написати посвячений CLI.js, який, у свою чергу, вимагає () індексу.js / обробника, як зазначено в інших коментарях.
Адріан Федер

50

Відповідно до інших відповідей, додайте до someFile.js

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

Потім ви можете додати до package.json

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

З терміналу можна потім зателефонувати

npm run myScript

Я вважаю це набагато простішим способом запам'ятати команди і використовувати їх


На моїй машині Win10 цей синтаксис просто повторює сценарій (або в терміналі PowerShell, або в командному рядку). Запустивши його безпосередньо замість 'npm run', викидає 'Несподіваний маркер', вказуючи на початок параметра вимагати. Я ще не зрозумів, як змусити це працювати.
CalvinDale

@CalvinDale тут же, за винятком того, що я можу запустити сам сценарій у повному обсязі.
ferr

3
На моїй машині (Windows 10) мені довелося переключити подвійні та одинарні лапки, як-от так: "myScript": "вузол -e \" потрібно ('./ someFile'). SomeFunction () \ "" Інакше Node просто роздрукуйте команду всередині однієї лапки, але не оцінюйте її. Можливо, це вирішує питання @CalvinDale та ferr.
Крістоф

3
Що робити, якщо ми хочемо додати аргумент до виклику функції?
Мігель Стівенс

26

Спробуйте зробити підрядним .

У db.js додайте require('make-runnable');до кінця.

Тепер ви можете зробити:

node db.js init

Будь-які подальші аргументи будуть передані initметоду.


16

Запустити безпосередньо з CLI (глобально)

Встановити

npm i -g run-func

Використання, тобто запустіть функцію "init", її потрібно експортувати, дивіться внизу

run-func db.js init

або

Запустити з script.json script (локальний)

Встановити

npm i -S run-func

Налаштування

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

Використання

npm run init

Парами

Будь-які наступні аргументи будуть передані як параметри функції init(param1, param2)

run-func db.js init param1 param2

Важливо

функцію (у цьому прикладі init) необхідно експортувати у файл, що містить її

module.exports = { init };

або ES6 експорту

export { init };

Я думав використовувати пропозицію eye_mew для використання make-runnable, але це набагато краще, ніж це, я думаю. Дякую.
luis.espinal

@ luis.espinal Я радий, що ви вважаєте це корисним. У фоновому режимі менше магії і не потрібно змінювати файли. Якщо функція не експортується, вона повинна бути, але це має логічний сенс, як і звичайні модулі ES6 та їх імпорт / експорт.
Pawel

це не працює для мене; $ run-func db.js init bash: run-func: команда не знайдена
Patlatus

@Patlatus використовувати безпосередньо з CLI без скрипту в package.json встановити його глобальноnpm i -g run-func
Pawel

@Patlatus насправді виникла помилка, яка лише дозволяла цьому запускатися всередині script.json-скриптів. Я завантажив нову версію, яка її виправляє, і вона також працює в усьому світі
Pawel

9

простий спосіб:

скажімо, у вас є файл db.js у каталозі помічників у структурі проекту.

Тепер перейдіть до каталогу помічників і перейдіть до консолі вузлів

 helpers $ node

2) вимагати файл db.js

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

3) викликайте свою функцію (у вашому випадку її init ())

> db.init()

сподіваюся, що це допомагає


7

Якщо включити db.jsв модуль ви можете вимагати його від db_init.jsі просто: node db_init.js.

db.js:

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

db_init.js:

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

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

7

Цей брудний, але працює :)

Я буду викликати main()функцію зі свого сценарію. Раніше я просто ставив дзвінки в основний в кінці сценарію. Однак я додав деякі інші функції та експортував їх із скрипту (для використання функцій в деяких інших частинах коду) - але я не хочу виконувати функцію main () кожного разу, коли я імпортую інші функції в інші сценарії.

Тому я зробив це, у своєму скрипті я видалив виклик до main (), а замість цього в кінці сценарію я поставив цю перевірку:

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

Отже, коли я хочу викликати цю функцію в CLI: node src/myScript.js main


5

Я роблю IIFE, щось подібне:

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

цей код буде виконаний негайно і викликає функцію init.


2
Але якщо запустити: node init.jsі файл містить IIFE, він буде працювати. Я думаю, що я не повністю зрозумів ваше запитання. Вибачте.
Натан Дейч

Повністю отримайте це, але якщо в коді є інші функції, їх можна або не можна називати
winhowes

1
Ви навіть можете спростити це, (init)();якщо хочете :)
Маленька ланька

1

Іноді ви хочете запустити функцію через CLI, іноді ви хочете виконати requireїї з іншого модуля. Ось як зробити і те, і інше.

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

-2

Просто, у файлі javascript testfile.js:

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

Запуск підказки:

node testfile.js

4
Звичайно, це дозволяє запустити файл JS. Оригінальне запитання виникає при виклику певної функції всередині цього файлу без зміни потоку файлу (у вашому прикладі testзапускається кожен раз, тому вам доведеться змінювати файл, щоб викликати іншу функцію)
winhowes

-3

Якщо ваш файл просто містить вашу функцію, наприклад:

myFile.js:

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

Викликаючи його з командного рядка так, нічого не відбудеться:

node myFile.js

Але якщо ви зміните свій файл:

myFile.js:

myMethod("Hello World");

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

Тепер це буде працювати з командного рядка:

node myFile.js

1
Звичайно, саме так запустити файл JS. Питання було більше спрямоване на те, чи можу я запустити конкретну функцію (з багатьох можливих функцій), де єдиною зміною було введення командного рядка, а не сам файл JS на виклик функції
winhowes

Це не стосується сценарію, про який запитують людину,
робота

@jobmo це, вони хочуть запустити метод з cmd-лінії, це робить це. (Я отримав тут вдаючись до допомоги питання сам, так що хто -то інший може оцінити відповідь), не хвилюйтеся , є різноманітний набір відповідей вам дозволено мати вибір
BLUNDELL

Саме питання стосується запуску методу з cmd-лінії. У цій відповіді виконується myFile.js. Це так. Це не виконує жодної функції. Тоді буває, що файл має функцію, а функція викликається всередині файлу. Це був мій погляд.
роботамо

Ви щойно пояснили, що відповідь виконує функцію з командного рядка: +1:
Blundell
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.