在node.js上传应用程序中60秒后连接重置

问题描述

我已经在node.js中编写了一个应用程序,该应用程序由用于存储/上传文件的服务器和客户端组成。

出于复制目的,这是使用服务器中的空写入流和客户端中的随机读取流的概念证明。

在Ubuntu 18.04上使用node.js 12.19.0。客户端依赖于node-fetch v2.6.1。

我遇到的问题是在60秒后重置连接,并且没有找到使之工作的方法。

任何想法都值得赞赏。

谢谢。

testServer.js

// -- DevNull Start --
var util         = require('util'),stream       = require('stream'),Writable     = stream.Writable,setImmediate = setImmediate || function (fn) { setTimeout(fn,0) }
  ;
util.inherits(DevNull,Writable);
function DevNull (opts) {
  if (!(this instanceof DevNull)) return new DevNull(opts);
  opts = opts || {};
  Writable.call(this,opts);
}
DevNull.prototype._write = function (chunk,encoding,cb) {
  setImmediate(cb);
}
// -- DevNull End --
const http = require('http');
const server = http.createServer();
server.on('request',async (req,res) => {
  try {
    req.socket.on('end',function() { 
      console.log('SOCKET END: other end of the socket sends a FIN packet');
    });
    req.socket.on('timeout',function() { 
      console.log('SOCKET TIMEOUT');
    });
    req.socket.on('error',function(error) { 
      console.log('SOCKET ERROR: ' + JSON.stringify(error));
    });
    req.socket.on('close',function(had_error) { 
      console.log('SOCKET CLOSED. IT WAS ERROR: ' + had_error);
    });
    const writeStream = DevNull();
    const promise = new Promise((resolve,reject) => {
      req.on('end',resolve);
      req.on('error',reject);
    });
    req.pipe(writeStream);
    await promise;
    res.writeHead(200);
    res.end('OK');
  } catch (err) {
    res.writeHead(500);
    res.end(err.message);
  }
});
server.listen(8081)
  .on('listening',() => { console.log('Listening on port',server.address().port); });

testClient.js

// -- RandomStream Start --
var crypto = require('crypto');
var stream = require('stream');
var util = require('util');
var Readable = stream.Readable;
function RandomStream(length,options) {
  // allow calling with or without new
  if (!(this instanceof RandomStream)) {
    return new RandomStream(length,options);
  }
  // init Readable
  Readable.call(this,options);
  // save the length to generate
  this.lenToGenerate = length;
}
util.inherits(RandomStream,Readable);
RandomStream.prototype._read = function (size) {
  if (!size) size = 1024; // default size
  var ready = true;
  while (ready) { // only cont while push returns true
    if (size > this.lenToGenerate) { // only this left
      size = this.lenToGenerate;
    }
    if (size) {
      ready = this.push(crypto.randomBytes(size));
      this.lenToGenerate -= size;
    }
    // when done,push null and exit loop
    if (!this.lenToGenerate) {
      this.push(null);
      ready = false;
    }
  }
};
// -- RandomStream End --
const fetch = require('node-fetch');
const runSuccess = async () => { // Runs in ~35 seconds
  const t = Date.now();
  try {
    const resp = await fetch('http://localhost:8081/test',{
      method: 'PUT',body: new RandomStream(256e6) // new RandomStream(1024e6)
    });
    const data = await resp.text();
    console.log(Date.now() - t,data);
  } catch (err) {
    console.warn(Date.now() - t,err);
  }
};
const runFail = async () => { // Fails after 60 seconds
  const t = Date.now();
  try {
    const resp = await fetch('http://localhost:8081/test',body: new RandomStream(1024e6)
    });
    const data = await resp.text();
    console.log(Date.now() - t,err);
  }
};
// runSuccess().then(() => process.exit(0));
runFail().then(() => process.exit(0));

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)