从命令行(Node JS)在脚本中运行功能


204

我在Node中编写一个Web应用程序。如果我有一些db.js带有函数的JS文件,init如何从命令行调用该函数?



3
@Pawel我更喜欢接受的答案,因为它不需要安装第三方依赖关系,后者可能会失去支持或包含漏洞。任何依赖都存在风险,因此将依赖关系限制为经过良好审查和维护的依赖关系总是一个好主意。
winhowes

Answers:


329

对于您为什么要这样做,或者什么是更标准的做法,没有任何评论:这是您问题的解决方案...。请记住,命令行所需的引号类型可能会有所不同。

在您中db.js,导出init功能。有很多方法,但是例如:

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

然后假设您db.js与命令提示符位于同一目录中,然后这样调用它:

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

对于其他读者来说,OP的 init功能可以被称为任何东西,这并不重要,它只是问题中使用的特定名称。


80
这是测试从AWS lambda运行的某些javascript的有用技巧-谢谢
Alex Hinton

14
如果函数异步,会发生什么?
奥古斯丁·里丁格

24
万一其他人想在他们的package.json中将其作为npm脚本来执行此操作,我尝试使用单引号和双引号来进行尝试,但是直到我切换它们后它才起作用:“ start”:“ node- e \“ require('./ server')()\”“
Sako73 '17

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,如其他注释中所述,依次使用require()的index.js / handler。
AdrianFöder17年

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中运行脚本本身就很好。
Ferr

3
在我的机器上(Windows 10),我必须切换双引号和单引号,例如:“ myScript”:“ node -e \” require('./ someFile')。someFunction()\“”“否则,Node将只需在单引号内打印出命令,但不对其求值。也许这解决了@CalvinDale和ferr的问题。
克里斯多夫(Christoph)

3
如果要在函数调用中添加参数怎么办?
米格尔·史蒂文斯

26

尝试make-runnable

在db.js中,添加require('make-runnable');到最后。

现在您可以执行以下操作:

node db.js init

任何其他的args都会传递给该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可直接从CLI使用,而无需在package.json中使用脚本。全局安装它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

完全可以理解,但是如果代码包含其他功能,则可能会调用它们,也可能不会调用它们
winhowes

您甚至可以将其简化为(init)();:)
Little Doe

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,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.