【问题标题】:How to start two commands sequentially in node JS application如何在节点JS应用程序中顺序启动两个命令
【发布时间】:2018-04-06 09:04:35
【问题描述】:

我已经使用 mocha-chai 为我的节点 js 应用程序编写了一些单元测试。 我想通过 package.json 文件的 scripts 属性依次启动节点 JS 服务器和测试套件。

我的节点版本是 6.9.4。 我的 package.json 中的脚本如下所示:

"scripts": {
    "start": "node ./bin/www",
    "test":  "npm start && mocha"
 }

使用上述配置,如果我从 Visual Studio 代码终端将命令作为 'npm test' 触发,则只有服务器由 'npm start' 启动,而不会执行 'mocha'。

如果我将脚本更改如下:

"scripts": {
        "start": "node ./bin/www",
        "test":  "start && mocha"
     }

在这种情况下,在服务器启动后,mocha 也正在启动,但它在连接 ECONNREFUSED 120.1.1.1:8000 时出现错误。它还会弹出带有应用程序所在区域的 dos 命令提示符。即使此时我在浏览器中查看应用程序是否正在运行,我发现服务器已经停止运行。

我也徒劳地尝试过使用 npm-run-all 和 npm-run-series 包。 尝试用分号 (;) 代替 && 但没有得到想要的结果。

任何有关此要求的帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: node.js package.json


    【解决方案1】:

    我认为最好在测试本身中以编程方式启动服务器(我假设这是您正在尝试的)。这可以在测试的before 函数中完成。您可以在after 方法中停止服务器。这是我的一项测试中的一个示例:

      var server;
      var tempMongoDbUrl;
    
      before(function (done) {
        reqLogger.transports.console.silent = true; // Silent the logger.
    
        tempMongoDbUrl = process.env.MONGODB_URL;
        process.env.MONGODB_URL = tempMongoDbUrl + '_test';
    
        delete require.cache[require.resolve('../../data/db.js')];
        delete require.cache[require.resolve('../../../app.js')];
        server = require('../../../app.js'); // same as "node app.js"
        done();
      })
    
      after(function (done) {
        reqLogger.transports.console.silent = false;  // Enable the logger.
    
        server.close(function () {
          process.env.MONGODB_URL = tempMongoDbUrl;
          mongoose.connection.close(done);
        })
      })
    

    server = require('../../../app.js'); 启动服务器,server.close() 关闭它。

    很多人不会认为这是单元测试,而是集成测试。这是因为它正在测试几个单元(路由、服务器、控制器功能等)。但它仍在测试中,我认为像客户端一样测试端点是有价值的。以这种方式运行测试时,我没有遇到任何性能问题。

    【讨论】:

    • 我的测试用例看起来像我在stackoverflow.com/questions/46886850/… 中给出的那些。与您做很多事情的示例不同,我只使用了一个简单的单行语句,它只是在我的前块中启动服务器(即 server = require('../app.js') 。但是我仍然得到 ECONNREFUSED 120.1 .1.1:8000.
    • server = require('../../../app.js');server.close() 是重要的部分。我有 mongoose.connection.close() 关闭在 app.js 中启动的数据库连接。我还将数据库连接重命名为不接触普通数据库。您可以使用应用程序文件编辑您的帖子吗?为什么你的错误信息中的地址是 120.1.1.1?如果连接被拒绝,则可能有一个服务器实例已经在运行。在任何给定时间,只能在端口 8000 上运行一台服务器。
    • 你可以忽略我上一条评论的最后一句话。如果我理解正确,您会从客户端收到错误消息,因为服务器没有运行。我假设您在 app.js 中有类似 app.listen(8000); 的内容。您可以将其更改为app.listen(8000, function() { console.log('started server'); } 以确定服务器是否已启动。确保在测试开始运行之前看到已启动的服务器
    • 我能弄明白。实际上,我正在使用 ./bin/www 直接运行服务器,如我帖子上面的脚本块所示。因此,我将语句更改为 server = require('../bin/www') 以使其工作。谢谢。
    • 您应该确保将服务器对象导出到 bin/www 中。例如 module.exports = server; 在它的末尾。当您在测试文件中执行 server = require(...); 时,它将获得服务器对象,您必须将其存储在具有正确范围的变量中,以便在 after 函数中可用。在我的例子中是var server;
    【解决方案2】:

    当您定义 npm 脚本时,您可能会自动运行 pre 和 post 脚本。

    "scripts": {
        "premyscript": "echo \"Run 1st\"",
        "myscript": "echo \"Run after\"",
        "postmyscript": "echo \"Run last\""
    }
    

    当你点击 'npm run myscript' > 一切都会运行

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多