簡體   English   中英

在child_process.fork上的Node.js調用函數

[英]Node.js calling function on child_process.fork

我有一個server.js模塊,可以導出start()函數來啟動服務器。 我需要此模塊,然后從index.js啟動服務器。

我正在嘗試通過在child_process.fork調用中啟動服務器來隔離地(通過Mocha)對server.js模塊進行單元測試,但是我看不到如何調用導出的啟動函數。

當前通過將'index.js'傳遞給fork調用來工作,但是我看不到如何將選項傳遞給server.js模塊(例如,發送端口號)。

這是我的server.js和使用index.js的單元測試 (僅需要並調用server.start())。

我想直接測試server.js,以便將環境變量傳遞給它。

====編輯====

我不確定通過單獨啟動服務器會獲得什么收益。
我將測試更改為僅在before塊中啟動服務器。
歡迎提出建議。

var assert = require("assert");
var request = require("request");

describe("Server", function(){
  var server;
  var port = 4008;

  before(function(done){
    server = require("../server");
    server.start(port);
    done();
  });

  it('listens on specified port (' + port + ')', function(done){
    request('http://localhost:' + port, function(err, res, body){
      assert(res.statusCode == 200);
      done();
    });
  });

});

您可能需要為此使用cluster模塊,這使得處理過程更加簡單。 以下可能符合您的需求。

var cluster = require('cluster');

// Runs only on the master process.
if (cluster.isMaster) {
    var environmentVariables = { PORT: 2020 };

    var worker = cluster.fork(environmentVariables);

    // Catch a message from the worker, and then destroy it.
    worker.on('message', function(message) {
        if (message.hasOwnProperty('testResult')) {
            // Kill the worker.
            worker.destroy();

            // Then do something with the result.
        }
    });
}

// Runs only on a worker process.
if (cluster.isWorker) {
    var server = require('./server');

    server.start();

    // Do some stuff for tests.

    // Send the test result.
    process.send({ testResults: 'pass', failReason: null });
}

我尚未對此進行測試,但希望要點是明確的。 可以在生成工作進程時傳遞自定義環境變量,然后讓工作進程將結果通知主進程。 您可能需要處理退出事件以及工人崩潰或掛斷時的超時。

process.env.PORT一句,您可能應該將process.env.PORT包裝在parseInt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM