我正在节点中编写一个Web应用程序。如果我有一些JS文件db.js,其中包含函数init,那么如何从命令行调用该函数?
- 使用npm run func stackoverflow.com/a/43598047/696535
- @pawel我更喜欢接受的答案,因为它不需要安装第三方依赖项,这可能会失去支持或包含漏洞。使用任何依赖关系都是一种风险,因此将依赖关系限制到经过良好审查和维护的依赖关系总是一个好主意。
对于您为什么要这样做,或者什么可能是一个更标准的实践没有评论:这里是您的问题的解决方案……请注意,您的命令行所需的引号类型可能有所不同。
在您的db.js中,导出init函数。有很多种方法,但例如:
1 2 3
| module.exports.init = function () {
console.log('hi');
}; |
然后这样调用它,假设您的db.js与命令提示符位于同一目录中:
1
| node -e 'require("./db").init()' |
对于其他读者来说,op的init函数可以被称为任何东西,这并不重要,它只是问题中使用的特定名称。
- 这是一个有用的提示,用于测试一些运行在AWS lambda中的javascript-谢谢
- 如果函数是异步的,会发生什么?
- 如果其他人试图在他们的package.json中以NPM脚本的形式执行此操作,我使用单引号和双引号进行了尝试,但直到我将它们切换为:"start":"node-e"require("./server")()",
- 出现错误"typeerror:require(…).init不是函数"
- @c.lee正在脚本中初始化函数?
- @winhowes是的,init只是发布示例的一部分-可以调用任何东西,只是脚本的入口点。
- 命令行上的引号取决于您的操作系统
- @leegee yep——只是帮助@c.lee调试——因为他们可能没有意识到init是脚本文件中的一个函数。
- 谢谢@winhowes的回复,我只是用了你的例子module.exports.init = function () { console.log('hi'); };和node -e 'require("./db").init()'不知怎么的不适合我。我不知道我做错了什么,但按照你的想法,我用了module.exports = myFunction, ,然后node -e 'require("./myFunction")()'为我工作。
- 作为对@alexinton评论的补充,我现在使用以下内容来模拟事件和回调:node -e 'require("./index").handler(require("./fixtures/sample_event_01.json"), {}, console.log)'。中间的{}是上下文,可以随意调整。此外,console.log有点原始,但还是一个不错的开始。当然,您也可以编写一个专用的cli.js,它反过来需要()的index.js/handler,如其他注释中所述。
- @Leegee就是一个很好的例子:我有一个我想运行的脚本。出于我自己的原因,我决定用JavaScript编写它。现在我想运行它。我正好想到了一个特别的应用程序,这就是我来这里的原因。
- 如何将此执行添加到package.json脚本中?谢谢
- @Tokra-在你的package.json的scripts节点上添加以下内容:"example":"node -e 'require("./db").init()'"ymmv和转义引号!
- node-p而不是node-e打印结果:nodejs.org/api/cli.html_cli_p_print_script
根据其他答案,在someFile.js中增加以下内容
1 2 3
| module.exports.someFunction = function () {
console.log('hi');
}; |
然后您可以将以下内容添加到package.json。
1 2 3
| "scripts": {
"myScript":"node -e 'require("./someFile").someFunction()'"
} |
从终点站,你可以打电话
我发现这是一个更容易记住命令并使用它们的方法
- 在我的Win10机器上,此语法只是在响应脚本(在PowerShell或命令提示终端中)。直接运行它,而不是通过"npm run"将"unexpected token"抛出指向所需参数的开头。我还没弄明白怎么让它工作。
- @Calvindale和这里一样,只是我可以在PowerShell中运行脚本本身。
- 在我的机器(Windows10)上,我必须切换双引号和单引号,比如:"myscript":"node-e"需要("./somefile").someFunction()",否则node只会在单引号中打印出命令,而不会对其进行计算。也许这就解决了@calvindale和ferr的问题。
- 如果我们想在函数调用中添加一个参数呢?
尝试使可运行。
在db.js中,在末尾添加require('make-runnable');。
现在你可以做到:
任何进一步的参数都将传递给init方法。
将run func安装到项目
运行任何导出的函数
以下任何参数都将作为函数参数init(param1, param2)传递。
1
| run-func db.js init param1 param2 |
这也可以从package.json中的"scripts"部分运行。
1
| "db-init":"run-func db.js init" |
重要的是,必须在包含函数的文件中导出函数(在本例中为init)
1
| module.exports = { init }; |
或ES6出口
- 我想用Eye-Mew的建议来使用make-runnable,但我认为这比这要好得多。谢谢。
- @路易斯。埃斯皮纳尔,我很高兴你发现这个有用。后台的魔法更少,不需要修改文件。除非一个函数不被导出,否则它必须是,但这与常规ES6模块及其导入/导出一样具有逻辑意义。
简单方法:
假设您在项目结构的helpers目录中有db.js文件。
现在进入helpers目录并转到node console
2)需要db.js文件
1
| > var db = require("./db") |
3)调用函数(在您的例子中是init())
希望这有帮助
如果你把db.js变成一个模块,你可以从db_init.js要求它,只需要:node db_init.js。
J.J.
1 2 3 4
| module.exports = {
method1: function () { ... },
method2: function () { ... }
} |
JS:
1 2 3 4
| var db = require('./db');
db.method1();
db.method2(); |
这是脏的,但可以用。
我将从脚本调用main()函数。以前,我只是在脚本的末尾调用main。但是,我添加了一些其他函数并从脚本中导出它们(在代码的其他部分使用函数),但我不希望每次在其他脚本中导入其他函数时都执行main()函数。
所以我做到了,在我的脚本中,我删除了对main()的调用,而在脚本末尾,我进行了以下检查:
1 2 3
| if (process.argv.includes('main')) {
main();
} |
所以当我想在cli:node src/myScript.js main中调用这个函数时
我过着这样的生活:
此代码将立即执行并调用init函数。
- 当然,但这不是从命令行调用的
- 但是如果你运行:node init.js,并且文件包含一个iLife,它就会工作。我想我没有完全理解你的问题。对不起的。
- 完全理解,但如果代码包含其他函数,则可以调用它们,也可以不调用它们。
简单,在javascript文件testfile.js中:
1 2 3 4
| module.exports.test = function () {
console.log('hi');
};
this.test(); |
在提示下运行:
- 当然,这样可以运行JS文件。最初的问题是在不更改文件流的情况下调用该文件中的特定函数(在您的示例中,每次运行test,因此您必须更改文件以调用另一个函数)。
如果您的文件只包含您的函数,例如:
MyFiel.JS:
1 2 3
| function myMethod(someVariable) {
console.log(someVariable)
} |
像这样从命令行调用它不会发生任何事情:
但如果您更改了文件:
MyFiel.JS:
1 2 3 4 5
| myMethod("Hello World");
function myMethod(someVariable) {
console.log(someVariable)
} |
现在,这将在命令行中工作:
- 当然,这就是运行JS文件的方法。问题更多的是我是否可以运行一个特定的函数(在许多可能的函数中),其中唯一的更改是命令行输入,而不是每个函数调用的JS文件本身。
- 这不是在处理这个人要求的情况
- @是的,他们想从命令行运行一个方法,这样做了。(我是通过自己的谷歌搜索来的,所以其他人可能会喜欢这个答案),别担心,有一套不同的答案你可以选择。
- 准确地说,问题是关于从命令行运行一个方法。在这个答案中,会执行myfile.js,就是这样。它不执行任何函数。然后,文件就有了一个函数,函数在文件内部被调用。这就是我的观点。
- 您刚刚解释了应答从命令行执行函数:+1: