我正在使用Node编写一个Web应用程序。如果我有一个JS文件db.js
,其中包含一个名为init
的函数,我该如何从命令行调用该函数?
我正在使用Node编写一个Web应用程序。如果我有一个JS文件db.js
,其中包含一个名为init
的函数,我该如何从命令行调用该函数?
不对你想要做这件事情的原因发表评论,也不谈什么是更加标准的做法:以下是你问题的解决方案...请记住,所需引号类型可能会因命令行而异。
在db.js
文件中,导出init
函数。有很多方法,但以下是一个例子:
module.exports.init = function () {
console.log('hi');
};
假设你的 db.js
文件与命令提示符处于同一目录下,则可以按以下方式调用:
node -e 'require("./db").init()'
如果你的db.js
是一个模块db.mjs
,使用动态导入来加载该模块:
node -e 'import("./db.mjs").then( loadedModule => loadedModule.init() )'
对于其他读者而言,原帖中的 init
函数可以被称为任何名称,它并不重要,只是问题中使用的特定名称。
module.exports.init = function () { console.log('hi'); };
但是 node -e 'require("./db").init()'
对我不起作用。
我不确定我做错了什么,但是遵循您的思路,我使用了 module.exports = myFunction,
,然后 node -e 'require("./myFunction")()'
对我有效。 - C.Leenode -e 'require("./index").handler(require("./fixtures/sample_event_01.json"), {}, console.log)'
。中间的 {}
是上下文,可以自由调整。另外 console.log
有点原始但是一个不错的开端。当然,您也可以编写一个专用的 CLI.js
,该文件会依次使用 index.js/handler
,就像其他评论所述。 - Adrian Föder2020年更新 - 命令行界面(CLI)
如@mix3d所指出,你可以运行一个命令,其中file.js
代表你的文件,someFunction
是你的函数名称,可选择跟随参数以空格分隔。
npx run-func file.js someFunction "just some parameter"
就是这样。
file.js
在上面的示例中被调用。
const someFunction = (param) => console.log('Welcome, your param is', param)
// exporting is crucial
module.exports = { someFunction }
更加详细的描述
直接从命令行界面运行(全局)
安装
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 };
make-runnable
,但是这个方法比那个好多了,我认为。谢谢。 - luis.espinalnpx
,我们可以使用 npx run-func file.js functionName
来运行函数,而无需全局安装 run-func。 #胜利! - mix3dnpx run-func /path/to/folder/file.js myfunction
- Jay Teli按照其他答案的建议,在someFile.js
中添加以下内容。
module.exports.someFunction = function () {
console.log('hi');
};
接着可以将以下内容添加到package.json
文件中:
"scripts": {
"myScript": "node -e 'require(\"./someFile\").someFunction()'"
}
从终端,您可以调用以下命令
npm run myScript
我发现这是记住命令并使用它们的更简单方法。
在db.js中,将require('make-runnable')
添加到末尾。
现在你可以这样做:
node db.js init
任何进一步的参数都将以列表或键值对的形式传递给init
方法。
有时候你想通过CLI运行一个函数,有时候你想从另一个模块中require
它。以下是如何做到两者兼顾。
// file to run
const runMe = () => {}
if (require.main === module) {
runMe()
}
module.exports = runMe
这个有点脏但是能用 :)
我将从我的脚本中调用main()
函数。 以前我只在脚本的末尾放置了对main的调用。不过,现在我添加了一些其他函数并从脚本中导出它们(以便在代码的其他部分中使用函数)-但是我不想每次在其他脚本中导入函数时都执行main()函数。
所以我这样做了,在我的脚本中删除了对main()的调用,而是在脚本的末尾放置了这个检查:
if (process.argv.includes('main')) {
main();
}
因此,当我想在CLI中调用该函数时:node src/myScript.js main
package.json
脚本中不需要强制使用双引号转义。 - Marecky简单的方法:
假设您在项目结构中的helpers目录中有一个名为db.js的文件。
现在进入helpers目录并进入node控制台。
helpers $ node
2) 要求引入 db.js 文件
> var db = require("./db")
3) 调用你的函数(在你的情况下是init())
> db.init()
希望这可以帮到您
db.js
转换为模块,您可以从 db_init.js
中 require 它,然后只需运行 node db_init.js
即可。
db.js
:module.exports = {
method1: function () { ... },
method2: function () { ... }
}
db_init.js:
var db = require('./db');
db.method1();
db.method2();
更新至2022年 - 如果您已切换到ES模块,您不能使用require技巧,您需要使用动态导入:
node -e 'import("./db.js").then(dbMod => dbMod.init());'
或者使用 --experimental-specifier-resolution=node 标记:
node --experimental-specifier-resolution=node -e 'import("./db").then(dbMod => dbMod.init());'
你还可以使用ts-node
来运行TypeScript,类似于@LeeGoddard的answer。
在我的情况下,我希望分别使用app
和init
进行测试。
// app.ts
export const app = express();
export async function init(): Promise<void> {
// app init logic...
}
// commonjs
npx ts-node -e 'require("./src/app").init();'
// esmodule
npx ts-node -e 'import("./src/app").then(a => a.init());'
ts-node -e 'require("./index.ts").run();'
即可。 - Davets-node
的二进制文件,否则 npx 将为 ts-node
提供一致的可重现性。 - Filip Seman