Javascript 从命令行在脚本中运行函数(节点JS)
我正在节点中编写一个web应用程序。如果我有一个JS文件Javascript 从命令行在脚本中运行函数(节点JS),javascript,node.js,command-line,Javascript,Node.js,Command Line,我正在节点中编写一个web应用程序。如果我有一个JS文件db.JS里面有一个函数init,我怎么能从命令行调用这个函数呢?如果你把db.JS变成一个模块,你可以从db_init.JS需要它,只要:节点db_init.JS db.js: module.exports = { method1: function () { ... }, method2: function () { ... } } db_init.js: var db = require('./db'); db.metho
db.JS
里面有一个函数init
,我怎么能从命令行调用这个函数呢?如果你把db.JS
变成一个模块,你可以从db_init.JS
需要它,只要:节点db_init.JS
db.js:
module.exports = {
method1: function () { ... },
method2: function () { ... }
}
db_init.js:
var db = require('./db');
db.method1();
db.method2();
不要评论你为什么要这样做,或者什么可能是更标准的做法:以下是你问题的解决方案。。。。请记住,命令行所需的引号类型可能会有所不同 在
db.js
中,导出init
函数。有很多方法,但例如:
module.exports.init = function () {
console.log('hi');
};
然后这样调用它,假设您的db.js
与命令提示符位于同一目录中:
node -e 'require("./db").init()'
对于其他读者来说,OP的init
函数可以被调用任何东西,这并不重要,它只是问题中使用的特定名称 试试看
在db.js中,添加require('make-runnable')代码>结束
现在您可以执行以下操作:
node db.js init
任何进一步的参数都将以列表或键值对的形式传递给init
方法。update2020-CLI
正如@mix3d所指出的,您可以运行一个命令,其中file.js
是您的文件,someFunction
是您的函数,可选地后跟以空格分隔的参数
npx run func file.js someFunction“只是一些参数”
就这样
file.js
在上述示例中调用
constsomefunction=(param)=>console.log('Welcome,您的参数是',param)
//出口至关重要
module.exports={someFunction}
更详细的描述
直接从CLI运行(全局)
安装
npm i -g run-func
npm i -S run-func
用法,即运行函数“init”,必须将其导出,请参见底部
run-func db.js init
或
从package.json脚本运行(本地)
安装
npm i -g run-func
npm i -S run-func
设置
用法
参数
以下任何参数都将作为函数参数init(param1,param2)
重要
函数(在本例中为init
)必须在包含该函数的文件中导出
module.exports = { init };
或ES6出口
export { init };
简单方法:
假设在项目结构的helpers目录中有db.js文件
现在进入helpers目录并转到节点控制台
helpers $ node
2) 需要db.js文件
> var db = require("./db")
3) 调用函数(在本例中为init())
如果您的文件只包含函数,希望这对您有所帮助,例如:
module.exports.init = function () {
console.log('hi');
};
myFile.js:
function myMethod(someVariable) {
console.log(someVariable)
}
myMethod("Hello World");
function myMethod(someVariable) {
console.log(someVariable)
}
像这样从命令行调用它不会发生任何事情:
node myFile.js
但如果您更改了文件:
myFile.js:
function myMethod(someVariable) {
console.log(someVariable)
}
myMethod("Hello World");
function myMethod(someVariable) {
console.log(someVariable)
}
现在可以从命令行执行此操作:
node myFile.js
根据其他答案,将以下内容添加到someFile.js
module.exports.someFunction = function () {
console.log('hi');
};
然后可以将以下内容添加到package.json
"scripts": {
"myScript": "node -e 'require(\"./someFile\").someFunction()'"
}
从终端,您可以呼叫
npm run myScript
我发现这是一种更容易记住命令并使用它们的方法这是一种肮脏但有效的方法
:)
我将从脚本中调用main()
函数。之前我只是在脚本的末尾调用main。不过,我确实添加了一些其他函数并从脚本中导出了它们(以便在代码的其他部分使用函数),但我不希望每次在其他脚本中导入其他函数时都执行main()函数
所以我就这样做了,,
在我的脚本中,我删除了对main()的调用,并在脚本的末尾进行了以下检查:
if (process.argv.includes('main')) {
main();
}
因此,当我想在CLI中调用该函数时:
node src/myScript.js main
我会执行类似这样的操作:
(() => init())();
此代码将立即执行并调用init函数。有时您希望通过CLI运行函数,有时您希望
从另一个模块要求它。这里有两种方法
// file to run
const runMe = () => {}
if (require.main === module) {
runMe()
}
module.exports = runMe
也许这个方法不是你的意思,但谁知道它会有帮助呢
index.js
const arg=process.argv.splice(2);
函数printToCli(文本){
console.log(文本)
}
开关(参数[0]){
案例“-run”:
printToCli(“你好吗”)
打破
默认值:console.log(“使用--run标志”);
}
然后运行命令节点--运行
命令行
probuss MacBook Air:fb_v8 probus$node--跑
你好吗
probuss MacBook Air:fb_v8 probus$
您可以添加更多参数[0]、参数[1]、参数[2]。。。还有更多
对于节点--run-myarg1-myarg2
这是测试从AWS lambda运行的一些javascript的有用技巧-谢谢如果函数是异步的,会发生什么?如果其他人试图在他们的package.json作为npm脚本中执行此操作,我尝试使用单引号和双引号,但直到我将它们切换为“start”后才起作用:“node-e\”require('./server')()\”,感谢@winhowes的回复,我刚刚使用了您的示例module.exports.init=function(){console.log('hi');}
和node-e'require(“./db”).init()“
不知何故对我不起作用。我不知道我做错了什么,但按照你的想法,我使用了module.exports=myFunction,
,然后node-e'require(“./myFunction”)(),
对我起了作用。作为@AlexHinton注释的补充,我现在使用以下命令来模拟事件和回调:node-e'require(./index”).handler(require(“/fixtures/sample_event_01.json”),{},console.log)
。中间的{}
将是上下文,请随意调整。此外,console.log有点原始,但是一个很好的开始。当然,您也可以编写一个专门的CLI.js,它反过来需要()如其他评论所述,这是index.js/handler。我想用eye_-mew的建议来使用使其可运行
,但我认为这比这要好得多。谢谢。@luis.espinal我很高兴你发现这很有用。t