![](/img/trans.png)
[英]node.js calling child_process.fork reports 'Error: listen EADDRINUSE'
[英]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.