【问题标题】:Node.JS: Make module runnable through require or from command lineNode.JS:通过 require 或命令行使模块可运行
【发布时间】:2018-08-23 02:14:15
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: node.js require


    【解决方案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】:

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

      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 模块可以帮助解决这个问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-05
          • 2020-09-24
          相关资源
          最近更新 更多