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() 插入的文件中?

通过套接字发送命令,但每次都等待响应(Node.js)

Node.js里面怎么设置process.env.PORT的值

node.js require() 源码解读

node.js 基础操作

node.js中使用yargs来处理命令行参数