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

Node.JS: Make module runnable through require or from command line

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

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

简单地导出带有回调参数的函数的问题在于,脚本可以 运行 没有任何开销很重要,这意味着没有命令行参数,没有额外的函数调用等,因为它是更大构建过程的一部分。

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

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

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

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

我最近也在找这个,遇到一个somewhat-related问题:“Node.JS:检测是通过require调用还是直接通过命令行调用 ”,它有 an answer 帮助我在几分钟前构建了类似下面的东西,其中导出只有 运行 如果它被用作模块,并且只需要 CLI 库如果 运行 作为脚本。

function doSomething (opts) {
}

/*
 * Based on
 * 
 */
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
  }
}

可能出于某种原因这不是一个好主意,但我不是专家。

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