如何在节点JS应用程序中按顺序启动两个命令

时间:2017-10-25 10:09:54

标签: node.js package.json

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

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

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

使用上面的配置,如果我从我的Visual Studio代码终端触发命令为  npm test' ,那么只有服务器才能通过  npm start'而且没有“摩卡咖啡”正在执行。

如果我更改脚本如下:

{{1}}

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

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

对此要求的任何帮助都会非常感激。

感谢。

2 个答案:

答案 0 :(得分: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()关闭它。

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

答案 1 :(得分:0)

定义npm脚本时,您可能会自动运行前脚本和后脚本。

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

当您点击“ npm run myscript”>将会全部运行