Node.JS:通过 require 或命令行使模块可运行
Posted
技术标签:
【中文标题】Node.JS:通过 require 或命令行使模块可运行【英文标题】:Node.JS: Make module runnable through require or from command line 【发布时间】:2018-08-23 02:14:15 【问题描述】:我有一个异步运行的脚本setupDB.js
,旨在从命令行调用。最近,我在我的项目中添加了测试用例,其中一些需要设置数据库(因此需要执行上述脚本)。
现在,我想知道脚本什么时候完成它的工作。目前我只是在要求setupDB.js
之后等待几秒钟,然后再开始测试,这显然是个坏主意。
简单地导出带有回调参数的函数的问题在于,脚本可以在没有任何开销的情况下运行很重要,这意味着没有命令行参数,没有额外的函数调用等,因为它是更大构建的一部分过程。
您对更好的方法有什么建议吗?
【问题讨论】:
【参考方案1】:我最近也在寻找这个,并遇到了一个有点相关的问题:“Node.JS: Detect if called through require or directly by command line ”,其中有an answer,它帮助我在几分钟前构建了类似下面的东西,其中导出仅在以下情况下运行它被用作一个模块,只有在作为脚本运行时才需要 CLI 库。
function doSomething (opts)
/*
* Based on
* https://***.com/a/46962952/7665043
*/
function isScript ()
return require.main && require.main.filename === /\((.*):\d+:\d+\)$/.exec((new Error()).stack.split('\n')[ 2 ])[ 1 ]
if (isScript)
const cli = require('some CLI library')
opts = cli.parseCLISomehow()
doSomething(opts)
else
module.exports =
doSomething
这可能不是一个好主意,但我不是专家。
【讨论】:
【参考方案2】:我现在已经这样处理了:我导出了一个执行设置的函数。一开始我检查脚本是否已从命令行调用,如果是,我只需调用该函数。同时,我也可以直接从另一个模块调用,并通过回调。
if (require.main === module)
// Called from command line
runSetup(function (err, res)
// do callback handling
);
function runSetup(callback)
// do the setup
exports.runSetup = runSetup;
【讨论】:
【参考方案3】:make-runnable npm 模块可以帮助解决这个问题。
【讨论】:
以上是关于Node.JS:通过 require 或命令行使模块可运行的主要内容,如果未能解决你的问题,请参考以下文章
Node.js:如何将全局变量传递到通过 require() 插入的文件中?