node.js - (PERL-> NODEJS)500 : Server closed connection without sending any data back

标签 node.js perl connection-timeout

我的 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.timeoutreq.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/

相关文章:

node.js - 当数据量很大时,Angular 2 http get 请求被调用两次

perl - 如何在 Perl 中递归复制目录并过滤文件名?

perl - 如何将 Perl 的哈希值转换为更灵活的数据结构?

java - Windows 会干扰 Java 的 Socket.setSOTimeout 吗?

javascript - 使用 mongojs 按时间戳查找文档

javascript - NodeJS 的递归 Promise 不会终止

javascript - 为什么过滤方法不删除数组的所有元素?

perl - 我们可以加载没有 ".pm"文件扩展名或其他文件扩展名的 perl 模块吗?

error-handling - DB2 - CLI0108E 通信链路故障。 SQLSTATE=40003

java - 在 Google App Engine java 中处理大数据时服务器遇到错误