我的 Perl 脚本与 Node.js 服务器通信并发送 Node.js 服务器需要执行的命令。虽然有些命令需要的时间较短,但其他命令则需要更长的时间。当该命令在服务器上执行时,连接处于静默状态。一段时间后,我收到错误:500:服务器关闭连接,没有发回任何数据
在此错误期间,该命令仍在服务器上执行,并获得了所需的结果(如果您检查服务器日志)。我的问题是,我不希望重置连接,因为在这些长时间运行的命令之后还需要运行其他后续命令。某些命令可能需要 20 分钟
Perl 端代码:
my $ua = LWP::UserAgent->new;
$ua->timeout(12000);
my $uri = URI->new('http://server');
my $json = JSON->new;
my $data_to_json = {DATA};
my $json_content = $json->encode($data_to_json);
# set custom HTTP request header fields
my $req = HTTP::Request->new(POST => $uri);
my $resp = $ua->request($req);
my $message = $resp->decoded_content;
NodeJS 代码
var express = require('express');
var http = require('http');
var app = express();
app.use(express.json());
var port = process.env.PORT || 8080;
app.get('<API URL>', function (req, res) {
<get all the passed arguments>
<send output to the console>
});
app.post('<API URL>', function(req, res) {
.
.
.
req.connection.setTimeout(0);
var exec = require('child_process').exec;
var child = exec(command);
}
// start the server
const server = app.listen(port);
server.timeout = 12000;
console.log('Server started! Listening on port' + port);
我尝试使用server.timeout
和req.connection.setTimeout(0);
为服务器添加超时。
如何确保连接没有断开?
最佳答案
让网络 worker 执行长时间运行的任务通常是一个坏主意。它束缚了 worker ,最终会遇到这样的问题。
相反,让 Web Worker 将作业添加到某种作业队列中(Perl 的 Minion 非常好)。队列独立于 Web 服务器运行。客户端可以轮询服务器以检查作业的状态并在完成时获取输出或工件。
适当的作业队列的另一个优点是,如果作业失败,您可以重新启 Action 业。队列知道工作就在那里。正如您所看到的,网络连接中断意味着它会失败,并且您可能已经失去了对这些输入的跟踪。
关于node.js - (PERL-> NODEJS)500 : Server closed connection without sending any data back,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62481380/