Node.js调用child_process.fork上的函数

时间:2013-01-06 06:44:13

标签: node.js

我有一个server.js模块,它导出一个start()函数来启动我的服务器。 我需要这个模块并从index.js启动服务器。

我试图通过在child_process.fork调用中启动服务器来单独测试server.js模块(使用Mocha),但我没有看到如何调用导出的启动函数。

它目前正在通过将'index.js'传递给fork调用,但后来我没有看到如何将选项传递给server.js模块(例如发送端口号)。

这是我的server.js和使用index.js的unit test(只需要并调用server.start())。

我想直接测试server.js,所以我可以将环境变量传递给它。

====编辑====

我不确定我认为通过在单独的过程中启动服务器会获得什么 我已经将测试更改为只在前一个块中启动服务器 建议欢迎。

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();
    });
  });

});

1 个答案:

答案 0 :(得分:1)

您可能希望使用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包裹在parseInt中。