コマンドラインからスクリプトで関数を実行する(Node JS)


204

NodeでWebアプリを書いています。db.js関数が含まinitれているJSファイルがある場合、コマンドラインからその関数を呼び出すにはどうすればよいですか?



3
@Pawelサポートを失ったり、脆弱性を含む可能性のあるサードパーティの依存関係をインストールする必要がないため、私は受け入れられた答えを好みます。これは依存関係を使用して実行するリスクであるため、依存関係を十分に吟味され維持されている依存関係に制限することは常に良い考えです。
winhowes 2017年

回答:


329

なぜこれを実行するのか、またはより標準的な方法は何であるかについてのコメントはありません。これが質問に対する解決策です。...コマンドラインで必要な引用符の種類は異なる場合があることに注意してください。

db.jsinit関数をエクスポートします。多くの方法がありますが、例えば:

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

次にdb.js、コマンドプロンプトと同じディレクトリにいると想定して、次のように呼び出します。

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

他の読者にとって、OPの init機能は何とでも呼ばれる可能性があり、それは重要ではなく、質問で使用される特定の名前にすぎません。


80
これは、AWS lambdaから実行されている一部のJavaScriptをテストするのに役立つヒントでした。ありがとう
Alex Hinton

14
関数が非同期の場合はどうなりますか?
オーガスティンリーディンガー2017年

24
他の誰かがpackage.jsonでnpmスクリプトとしてこれを実行しようとしている場合は、一重引用符と二重引用符を内側に使用して試しましたが、切り替えると機能しませんでした: "start": "node- e \ "require( './ server')()\" "、
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は少し原始的ですが、良いスタートです。もちろん、他のコメントで述べられているようにrequire()のindex.js / handlerである専用のCLI.jsを書くこともできます。
AdrianFöder2017年

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」経由ではなく直接実行すると、requireパラメータの開始を指す「Unexpected token」がスローされます。私はまだそれを動作させる方法を理解していません。
CalvinDale 2018年

@CalvinDaleここでも同じですが、PowerShellでスクリプト自体を実行できます。
FERR

3
私のマシン(Windows 10)では、次のように二重引用符と単一引用符を切り替える必要がありました: "myScript": "node -e \" require( './ someFile')。someFunction()\ ""そうでなければ、ノードは単一引用符内のコマンドを出力するだけで、評価はしません。多分これは@CalvinDaleとferrの問題を解決します。
Christoph

4
関数呼び出しに引数を追加したい場合はどうなりますか?
ミゲルスティーブンス

26

make-runnableを試してください。

db.jsでrequire('make-runnable');、最後に追加します。

今あなたはできる:

node db.js init

それ以上の引数はinitメソッドに渡されます。


17

CLIから直接実行(グローバル)

インストール

npm i -g run-func

使用法、つまり関数「init」を実行します。エクスポートする必要があります。下部を参照してください

run-func db.js init

または

package.jsonスクリプトから実行(ローカル)

インストール

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 2017年

@ luis.espinalお役に立ててうれしいです。バックグラウンドでの魔法は少なく、ファイルを変更する必要はありません。関数がエクスポートされない限り、エクスポートする必要がありますが、これは通常のES6モジュールとそのインポート/エクスポートと同様に論理的に理にかなっています。
Pawel

これは私にはうまくいきません。$ run-func db.js init bash:run-func:command not found
Patlatus

@Patlatusは、package.jsonのスクリプトなしでCLIから直接使用し、グローバルにインストールしますnpm i -g run-func
Pawel

@Patlatusには実際には、package.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()関数を実行したくありません。

だから私はこれを行いました、スクリプトでmain()への呼び出しを削除し、代わりにスクリプトの最後にこのチェックを入れました:

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

したがって、CLIでその関数を呼び出す場合: node src/myScript.js main


5

私はIIFEをします、そのようなもの:

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

このコードはすぐに実行され、init関数を呼び出します。


2
ただし、実行するnode init.jsと、ファイルにIIFEが含まれていれば動作します。私はあなたの質問を完全に理解していなかったと思います。ごめんなさい。
Natan Deitch

完全にそれを取得しますが、コードに他の関数が含まれている場合、それらは呼び出される場合と呼び出されない場合があります
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

@jobmoそうです、彼らはcmd行からメソッドを実行したいと思っています。(私は自分で質問をググリングしてここに来たので、誰か他の人が答えを評価するかもしれません)、あなたが選択できる多様な答えのセットがあることを心配しないでください
Blundell

正確には、cmd行からメソッドを実行することに関する質問です。この回答では、myFile.jsが実行されます。機能を実行するものではありません。次に、ファイルに関数があり、その関数がファイル内で呼び出されます。それが私のポイントでした。
jobmo

あなたはちょうど答えがコマンドラインから関数を実行することを説明しました:+1:
Blundell
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.