gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:13:15 26 4
gpt4 key购买 nike

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

我试图通过在 child_process.fork 调用中启动服务器来隔离(使用 Mocha)对 server.js 模块进行单元测试,但我不知道如何调用导出的启动函数。

目前它通过将“index.js”传递给 fork 调用来工作,但我不知道如何将选项传递给 server.js 模块(例如发送端口号)。

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

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

====编辑====

我不确定通过在单独的进程中启动服务器会得到什么。
我已将测试更改为仅在 before block 中启动服务器。
欢迎提出建议。

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 包装在 parseInt 中。

关于Node.js 在 child_process.fork 上调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com