节点请求处理程序使用流重新启动

时间:2016-03-31 04:54:22

标签: node.js stream youtube-dl

抱歉这个具体的问题,但我有一个非常奇怪的问题,我不知道为什么会这样。

我正在编写一个Node应用程序,它接受Youtube videoID,然后将音频流式传输给请求者。这是代码。

router.get('/video/:videoId', function(req, res, next) {
  console.log('requested ' + req.params.videoId);
  var filename = req.params.videoId + ".mp3";

  youtubeDL.exec(req.params.videoId, ['-x', '--audio-format', 'mp3', '-o', filename], {}, function(err, output) {
    if (err){
      res.send("bad request");
      return;
    }else{
      console.log("exec begin")
      res.setHeader("content-type", "audio/mp3");
      fs.createReadStream(filename).pipe(res);
      fs.unlink(filename);
      console.log("exec end")
    }
  });
  console.log("router end");
});

问题是请求开始"循环"我猜是我将如何描述它,并在停止之前调用请求3次。

例如,这里是http://localhost:3000/resources/video/JCHTX_pgw6A

的输出
requested JCHTX_pgw6A
router end
[Long pause here]
exec begin
exec end
GET /resources/video/JCHTX_pgw6A 200 17396.280 ms - -
requested JCHTX_pgw6A
router end
[Long pause here]
exec begin
exec end
GET /resources/video/JCHTX_pgw6A 200 17550.309 ms - -
requested JCHTX_pgw6A
router end
[Long pause here]
exec begin
exec end
GET /resources/video/JCHTX_pgw6A 200 1645.932 ms - -

它停止了。有没有人知道为什么会发生这种情况或如何获得更多信息?我完全难过了。

2 个答案:

答案 0 :(得分:0)

启动之后,您不应该立即调用fs.unlink()来传输文件,否则文件会停止流式传输到客户端。相反,要么找到一种直接从youtube流式传输的方法(更好的解决方案恕我直言,因为你会避免碰到磁盘)至少要等到文件完成流式传输才能删除它。对于后者可能看起来像:

console.log("exec begin")
res.setHeader("content-type", "audio/mp3");
fs.createReadStream(filename).pipe(res).on('finish', function() {
  fs.unlink(filename);
});
console.log("exec end")

或者甚至更好(等待文件描述符实际先关闭):

console.log("exec begin")
res.setHeader("content-type", "audio/mp3");
fs.createReadStream(filename).on('close', function() {
  fs.unlink(filename);
}).pipe(res);
console.log("exec end")

答案 1 :(得分:0)

将请求方法更改为POST,并且它停止了行为不端。