Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从命令行在脚本中运行函数(节点JS)_Javascript_Node.js_Command Line - Fatal编程技术网

Javascript 从命令行在脚本中运行函数(节点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

我正在节点中编写一个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.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