简体   繁体   English

尝试使用 Node.js 应用下载大文件时崩溃

[英]Node.js app crashing when trying to download large file using it

I am trying to write a program that can convert HTTP URLs to torrents.我正在尝试编写一个可以将 HTTP URL 转换为种子的程序。 This project is working basically working for download links contain small files.该项目基本上适用于包含小文件的下载链接。 Like a file of 1-500Mb.就像一个 1-500Mb 的文件。 My problem is if the file size is more than that the app is crashing or getting a timeout.我的问题是文件大小是否大于应用程序崩溃或超时。 So I want to know how to fix this.所以我想知道如何解决这个问题。 Below is my code and link to Github.下面是我的代码和 Github 链接。

https://github.com/savadks95/FireBit https://github.com/savadks95/FireBit

var http          = require('http');
var webtorrentify = require('webtorrentify-link');
var fs            = require('fs');
var url           = require("url");
var path          = require("path");
var validUrl      = require('valid-url');
var express       = require('express');
var getUrls       = require('get-urls');
var remote        = require('remote-file-size');
var app           = express();

var downloadLink;
var fileName;
var fileSize;
var server;
var parsed;
var param;
var link;
var port;
port = process.env.PORT || 80;

app.get('/favicon.ico', function(req, res){
console.log('favicon request recived');
});
app.get('*', function(req, res){
    if(req.url==='/'){

      //app.use('/public/html', express.static(path.join(__dirname)));

    fs.readFile('public/html/index.html', function (err, data) {
    res.write(data);  
  });
  }else if (req.url === '/l?thelink='){
    fs.readFile('public/html/emptyRequest.html', function (err, data) {
      res.write(data);
      res.end();
  });
}else{
//---------Reciving Url--------------------
  console.log(req.query.thelink);
  downloadLink=req.query.thelink;
  //-----------------------------------------

  //------------checking for valid url-------
  if (validUrl.isUri(downloadLink)) {
    console.log('Looks like an URL');
    //-----------------------------------------

    //----------Extracting filename-------------
    parsed = url.parse(downloadLink);
    fileName = path.basename(parsed.pathname);
    console.log(path.basename(parsed.pathname));
    //-------------------------------------------

    //----------Finding File size----------------
    remote(downloadLink, function(err, o) {
      fileSize = (o/1024)/1024;
      console.log('size of ' + fileName + ' = ' + fileSize+" MB");  
    //-------------------------------------------
    if (fileSize < 501)
    {
    ///////////////Creating Torrent////////////////////
    webtorrentify(downloadLink)
      .then(function (buffer) {
         console.log('creating the torrent');
         //res.send('what is');
         //-------------------------------------------
         res.setHeader('Content-Type', 'application/x-bittorrent');
         res.setHeader('Content-Disposition', `inline; filename="${fileName}.torrent"`);
         res.setHeader('Cache-Control', 'public, max-age=2592000'); // 30 days
         res.send(buffer);
         console.log(fileName+'.torrent created');
         res.end();
         //-------------------------------------------
      });
    ////////////////////////////////////////////////
    }
    else{
      console.log('More than 500 MB');
      res.send("<h4> More than 500 MB or invalid URL </h4>");
    }
  });
  }
  else {
    console.log('not url');
    fs.readFile('public/html/404.html', function (err, data) {
      res.write(data);
      res.end();
    });

  }
}
});

app.listen(port);

console.log('server up and running', port);

Node.js's pure file (fs) and big data handling functions usually fall a little short of handling files beyond 1GB, but with just one extra NPM package, EventStream, you can be able to parse through a massive dataset without crashing the Node server. Node.js 的纯文件 (fs) 和大数据处理功能通常无法处理超过 1GB 的文件,但只需一个额外的 NPM 包 EventStream,您就可以解析海量数据集,而不会导致 Node 服务器崩溃。 With EventStream package, you can download file sizes up to 3GB and above.使用 EventStream 包,您可以下载最大 3GB 及以上的文件。

A detailed implementation is given here in the below link.下面的链接中给出了详细的实现。 I would like to reiterate that the example implementation given in the below link solves your large file download problem.我想重申,以下链接中给出的示例实现解决了您的大文件下载问题。 Your ability to convert http urls into torrent stream, you seem to handle it already very well.您将 http url 转换为 torrent 流的能力,您似乎已经很好地处理了它。

https://itnext.io/using-node-js-to-read-really-really-large-files-pt-1-d2057fe76b33 https://itnext.io/using-node-js-to-read-really-really-large-files-pt-1-d2057fe76b33

And here is the NPM package for the event-stream module.这是事件流模块的 NPM 包。

https://www.npmjs.com/package/event-stream https://www.npmjs.com/package/event-stream

Hope this helps.希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM