【问题标题】:Express js server giving ERR_EMPTY_RESPONSEExpress js 服务器提供 ERR_EMPTY_RESPONSE
【发布时间】:2017-03-26 00:48:12
【问题描述】:

我正在使用 node.js 和 express.js 构建应用程序时遇到严重问题。
该应用程序将视频转换为 mp3。当视频长度不超过 5 分钟时,一切都按预期工作,http 服务器会向客户端发送一个下载按钮。
但是当视频太大时,服务器会过早地关闭连接,并且因为我使用的是 http 协议,客户端会重试请求,这一次在等待一段时间后会收到 ERR_EMPTY_RESPONSE。

app.post('/', function(req, res) {    

    var obj_dlConvert = apart_dl_cv.dlConvert(req.body.yt_url,140,apart_dl_cv.generateDir()); //the function that download from youtube and convert
    var lien = obj_dlConvert.link;
    var dossier = obj_dlConvert.dossier;
    var video_stream = obj_dlConvert.streame;

    obj_dlConvert.processus.on('end', () =>{
        fs.rename(path.join(__dirname,'uploads',dossier,dossier+'.mp3'), path.join(__dirname,'uploads',dossier,'video.mp3'), function(err) {
            if (err) {
                res.render('dlpage.hbs',{
                    renameError: true                 
                });
            }else res.render('dlpage.hbs',{
                dossier: dossier,
                fullLink: lien
            });
        });           
    }        
 }

 req.on("close", function() {
     obj_dlConvert.processus.kill();
     obj_dlConvert.processus.on('error', () => {
         if (fs.existsSync(path.join(__dirname,'uploads',dossier))){
             fse.removeSync(path.join(__dirname,'uploads',dossier));
         }
     }); 
 });

});

【问题讨论】:

  • 一些代码会很有用......
  • 能否添加路由处理程序来处理文件的实际下载?
  • 嗨@JeremyThille 这里是一些代码,谢谢你的帮助
  • 嗨@robertklep,这里是 app.post('/', function(req, res) {} 提前谢谢你
  • @sparpar 看起来您正在将 URL 呈现到转换后的 MP3 文件;哪个 Express 路由正在处理这些 URL?

标签: javascript node.js http express


【解决方案1】:

提供视频不是一次性交易。浏览器和服务器之间存在握手。当浏览器询问时,服务器需要能够提供“下一个”块。以下可以作为灵感:

var fs = require("fs"),
http = require("http"),
url = require("url");

exports.serveVideo = function(req, res, file) {
 var range = req.headers.range;
 var positions = range.replace(/bytes=/, "").split("-");
 var start = parseInt(positions[0], 10);

 fs.stat(file, function(err, stats) {
   var total = stats.size;
   var end = positions[1] ? parseInt(positions[1], 10) : total - 1;
   var chunksize = (end - start) + 1;

   res.writeHead(206, {
    "Content-Range": "bytes " + start + "-" + end + "/" + total,
    "Accept-Ranges": "bytes",
    "Content-Length": chunksize,
    "Content-Type": "video/mp4"
  });

var stream = fs.createReadStream(file, { start: start, end: end })
  .on("open", function() {
    stream.pipe(res);
  }).on("error", function(err) {
    res.end(err);
  });
});
}

【讨论】:

    猜你喜欢
    • 2016-02-28
    • 2020-01-25
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多