Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js (PERL->;NODEJS)500:服务器关闭了连接,但没有返回任何数据_Node.js_Perl_Connection Timeout - Fatal编程技术网

Node.js (PERL->;NODEJS)500:服务器关闭了连接,但没有返回任何数据

Node.js (PERL->;NODEJS)500:服务器关闭了连接,但没有返回任何数据,node.js,perl,connection-timeout,Node.js,Perl,Connection Timeout,我的Perl脚本与Node.js服务器对话,并发送Node.js服务器需要执行的命令。虽然有些命令花费的时间较少,但有些命令花费的时间较长。在服务器上执行命令时,连接处于静默状态。过了一会儿,我收到了错误:500:服务器关闭连接,但没有返回任何数据 在此错误期间,该命令仍在服务器上执行,并且获得了所需的结果(如果检查服务器日志)。我的问题是,我不想重置连接,因为在这些长时间运行的命令之后,还需要运行其他后续命令。有些命令可能需要20分钟 Perl端代码: my $ua = LWP::UserAg

我的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);
var express=require('express');
var http=require('http');
var-app=express();
使用(express.json());
var port=process.env.port | | 8080;
应用程序获取(“”,函数(请求,恢复){
});
应用程序张贴(“”,功能(请求,回复){
.
.
.
请求连接设置超时(0);
var exec=require('child_process')。exec;
var child=exec(命令);
}
//启动服务器
const server=app.listen(端口);
server.timeout=12000;
log('服务器已启动!正在侦听端口'+端口〕);
我已尝试使用
server.timeout
req.connection.setTimeout(0);
为服务器添加超时


如何确保连接没有断开?

让web工作人员执行长时间运行的任务通常不是一个好主意。这会束缚工作人员,最终会出现这样的问题

相反,让web工作者将作业添加到某种作业队列中(Perl非常好)。该队列独立于web服务器运行。客户端可以轮询服务器以检查作业的状态,并在作业完成时获取输出或工件


正确的作业队列的另一个优点是,如果作业失败,您可以重新启动作业。队列知道作业存在。正如您所看到的,断开的web连接意味着它失败,您可能已经失去了对这些输入的跟踪。

对此有何想法?谢谢您的回答。我想我必须离开繁重的web worker任务,除非我很快就能解决一些问题。这似乎是一个服务器问题,因为我甚至把
my$ua=LWP::UserAgent->new(keep_alive=>1)
但是没有用,我将超时改为0,它似乎可以工作。但从长远来看,我正在努力摆脱长时间打开连接的习惯。
server.timeout=0;