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

Node.JS:通过require或从命令行使模块可运行,node.js,require,Node.js,Require,我有一个脚本setupDB.js,它异步运行,打算从命令行调用。最近,我将测试用例添加到我的项目中,其中一些需要设置数据库(从而执行前面提到的脚本) 现在,我想知道脚本什么时候完成了它的工作。目前,我只是在要求setupDB.js之后等待几秒钟,然后才开始测试,这显然是个坏主意 简单地导出带有回调参数的函数的问题在于,脚本可以在没有任何开销的情况下运行非常重要,这意味着没有命令行参数,没有额外的函数调用等,因为它是更大构建过程的一部分 您对更好的方法有什么建议吗?我现在是这样处理的:我导出了一个

我有一个脚本
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;

我最近也在寻找这一点,并遇到了一个有点相关的问题:“这帮助我在几分钟前构建了类似于以下内容的东西,其中导出仅在用作模块时运行,而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
  }
}
这可能是个不好的主意,但我不是专家。

npm模块可以帮助解决这个问题