명령 줄에서 스크립트로 함수 실행 (노드 JS)


204

Node에서 웹 앱을 작성 중입니다. db.js함수 가있는 JS 파일이 있으면 init명령 줄에서 해당 함수를 어떻게 호출 할 수 있습니까?



3
@Pawel 지원을 잃거나 취약점을 포함 할 수있는 타사 종속성을 설치할 필요가 없으므로 허용되는 답변을 선호합니다. 의존성을 가지고 위험을 감수하기 때문에 의존성을 잘 검사하고 유지 관리하는 것으로 제한하는 것은 항상 좋은 생각입니다.
winhowes

답변:


329

왜 이런 일을하고 싶거나 더 표준적인 방법이 될 수 있는지에 대한 의견이 없습니다. 다음은 귀하의 질문에 대한 해결책입니다.

당신의에서 db.js, 내보내기 init기능. 여러 가지 방법이 있지만 예를 들면 다음과 같습니다.

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

그런 다음 db.js명령 프롬프트와 동일한 디렉토리에 있다고 가정하면 다음과 같이 호출하십시오 .

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

다른 독자들에게 OP의 init기능은 무엇이든 호출 될 수 있습니다. 중요하지는 않으며 질문에 사용 된 특정 이름 일뿐입니다.


80
이 글은 AWS Lambda에서 실행중인 일부 자바 스크립트를 테스트하는 데 유용한 팁입니다.-감사합니다
Alex Hinton

14
기능이 비동기 인 경우 어떻게됩니까?
Augustin Riedinger

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는 약간 원시적이지만 좋은 시작입니다. 물론 다른 의견에서 언급 한대로 index.js / handler를 요구하는 전용 CLI.js를 작성할 수도 있습니다.
Adrian Föder 2016 년

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 매개 변수의 시작을 가리키는 '예기치 않은 토큰'이 발생합니다. 아직 작동시키는 방법을 찾지 못했습니다.
CalvinDale

@CalvinDale은 powershell에서 스크립트 자체를 잘 실행할 수 있다는 점을 제외하고는 여기에서 동일합니다.
20:49에

3
내 컴퓨터 (Windows 10)에서 다음과 같이 큰 따옴표와 작은 따옴표를 전환해야했습니다. "myScript": "node -e \"require ( './ someFile'). someFunction () \ ""그렇지 않으면 노드가 작은 따옴표 안에 명령을 인쇄하고 평가하지 마십시오. 아마도 이것은 @CalvinDale과 ferr의 문제를 해결할 수 있습니다.
Christoph

3
함수 호출에 인수를 추가하려면 어떻게해야합니까?
Miguel Stevens

26

make-runnable을 시도하십시오 .

db.js require('make-runnable');에서 끝에 추가 하십시오.

이제 할 수있는 일 :

node db.js init

추가 인수는 init메소드에 전달됩니다 .


16

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

@ luis.espinal 이것이 유용하다는 것을 알게되어 기쁩니다. 백그라운드에는 마술이 적고 파일을 수정할 필요가 없습니다. 함수가 익스포트되지 않는 한, 함수는 익스포트되어야하지만, 일반적인 ES6 모듈 및 임포트 / 익스포트와 마찬가지로 논리적으로 의미가 있습니다.
Pawel

이것은 나를 위해 작동하지 않습니다; $ run-func db.js init bash : run-func : 명령을 찾을 수 없음
Patlatus

@Patlatus는 package.json에 스크립트없이 CLI에서 직접 사용하기 위해 전 세계적으로 설치npm i -g run-func
Pawel

@Patlatus는 실제로 package.json 스크립트에서만 실행할 수있는 버그가있었습니다. 나는 그것을 고치는 새로운 버전을
Pawel

9

간단한 방법 :

프로젝트 구조의 helpers 디렉토리에 db.js 파일이 있다고 가정 해 봅시다.

이제 helpers 디렉토리로 이동하여 노드 콘솔로 이동하십시오.

 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 1

완전히 이해하되, 코드에 다른 함수가 포함되어 있으면 호출 될 수도 있고 호출되지 않을 수도 있습니다
winhowes

1
당신 (init)();이 원하는 경우에 당신은 그것을 간단하게 할 수 있습니다 :)
작은 doe

1

때로는 CLI를 통해 함수를 실행하고 싶거나 때로는 require다른 모듈에서 함수를 원할 수도 있습니다 . 두 가지를 모두 수행하는 방법은 다음과 같습니다.

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

-2

자바 스크립트 파일 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.