Node.JS:通过require或命令行使模块可运行

时间:2018-03-14 13:55:41

标签: node.js require

我有一个异步运行的脚本setupDB.js,旨在从命令行调用。最近,我在我的项目中添加了测试用例,其中一些需要设置数据库(从而执行上述脚本)。

现在,我想知道脚本何时完成了它的工作。目前我只是在开始测试之前需要setupDB.js之后等待几秒钟,这显然是一个坏主意。

简单地使用回调参数导出函数的问题是,脚本可以在没有任何开销的情况下运行,这意味着没有命令行参数,没有额外的函数调用等,因为它是更大版本的一部分过程

您对更好的方法有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我现在用这种方式处理它:我导出一个执行设置的函数。在开始时,我检查脚本是否已从命令行调用,如果是,我只需调用该函数。同时,我也可以直接从另一个模块调用它并传递一个回调。

if (require.main === module) {
// Called from command line
    runSetup(function (err, res) {
        // do callback handling
    });
}

function runSetup(callback) {
     // do the setup
}
exports.runSetup = runSetup;

答案 1 :(得分:1)

我最近也在寻找这个问题,并且遇到了一个有点相关的问题:“Node.JS: Detect if called through require or directly by command line ”其中有an answer帮助我在几分钟之前构建了类似下面的内容只有在用作模块时才会运行,只有在作为脚本运行时才需要CLI库。

function doSomething (opts) {
}

/*
 * Based on
 * https://stackoverflow.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 :(得分:0)

make-runnable npm模块可以帮助解决这个问题。