从命令行(Node JS)运行脚本中的函数

352

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


使用npm run-func https://dev59.com/yF0a5IYBdhLWcg3wCE3P#43598047 - Pawel
5
我更喜欢被接受的答案,因为它不需要安装第三方依赖项,这可能会失去支持或包含漏洞。这是您在使用任何依赖项时都需要考虑的风险,因此将依赖项限制为经过充分审查和维护的依赖项始终是一个好主意。 - winhowes
你也可以使用 https://www.npmjs.com/package/invoke-script 包。 - Stefan van de Vooren
16个回答

7

我做了一个 IIFE,大概是这样的:

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

这段代码将立即执行并调用init函数。


2
但是如果你运行:node init.js,并且文件包含IIFE,它将起作用。我想我没有完全理解你的问题。抱歉。 - Natan Deitch
完全理解,但如果代码包含其他函数,则可能会或可能不会调用它们。 - winhowes
1
如果你想的话,甚至可以将它简化为(init)(); :) - Little doe

3

也许这种方法不是你想要的,但谁知道它可能会有所帮助。

index.js

const arg = process.argv.splice(2);

function printToCli(text){
    console.log(text)
}

switch(arg[0]){
    case "--run":
        printToCli("how are you")
    break;
    default: console.log("use --run flag");
}

并运行命令node . --run

命令行

probuss-MacBook-Air:fb_v8 probus$ node . --run
how are you
probuss-MacBook-Air:fb_v8 probus$ 

你可以添加更多的参数 arg[0],arg[1],arg[2] ... 等等

对于 node . --run -myarg1 -myarg2


3
如果你想要在项目中使用环境变量,可以使用 env-cmd 库来导入你的 .env 文件中定义的环境变量。
npx env-cmd node -e 'require("./db").init()'

如果你想运行文件中的特定函数,也可以使用run-func

npx env-cmd npx run-func db.js init someArg

或者,为了支持已接受答案的观点,你需要做类似以下的事情:
npx env-cmd node -e 'require("./db").init(someArg)'

在这里编写/更新表达式不够明确(例如在检查时容易错过),与提供命令的不同参数相比,因此我建议使用env-cmdrun-func
注意:必要时我通常在末尾添加--experimental-modules

1

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - Jmaurier
这对于从cmd中运行ts文件中的函数非常有用。似乎ts-node在幕后工作。 - Timo

1

继续其他答案,如果您想使其可重用,可以创建以下脚本:

// rn-fn.js
const [, , filePath, fn, ...args] = process.argv;
import(filePath).then((mod) => mod[fn](...args));

然后举个例子:

// hello.js
export function hello(str) {
  console.log(`hello ${str}`)
}

运行中:

node ./rn-fn.js ./hello.js hello world

在命令行中应该返回

hello world

-2
如果您的文件仅包含函数,例如:

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

3
可以,这是如何运行JS文件。问题更多地是针对我是否能够运行特定函数(在许多可能的函数中)的,而唯一的变化是命令行输入,而不是每次函数调用都改变JS文件本身。 - winhowes
这并不涉及到该人所询问的情况。 - jobmo
@jobmo 是的,他们想要从命令行运行一个方法,这个可以实现。我通过谷歌搜索得到了这个答案,所以其他人可能也会需要这个答案。不用担心,你可以选择多种不同的答案。 - Blundell
确切地说,这个问题是关于从命令行运行一个方法。在这个答案中,执行了myFile.js文件。就是这样。它没有执行任何函数。然后发生的是文件中有一个函数,并且该函数在文件内被调用。那就是我的观点。 - jobmo
你刚刚解释了答案是从命令行执行函数的。:+1: - Blundell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接