Node.js (PERL->;NODEJS)500:服务器关闭了连接,但没有返回任何数据
我的Perl脚本与Node.js服务器对话,并发送Node.js服务器需要执行的命令。虽然有些命令花费的时间较少,但有些命令花费的时间较长。在服务器上执行命令时,连接处于静默状态。过了一会儿,我收到了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
错误: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;