Экспресс app.post вызывается несколько раз

Я создавал приложение для конвертации видео на YouTube, которое транслирует видео на YouTube с помощью youtube-dl и сохраняет их, все работало нормально, пока я не попытался воспроизвести видео, которое длилось более часа. Когда задача была выполнена где-то между 50% - 100% или 40-80 секундами, это было бы тогда, когда весь блок кода был бы перезапущен, что привело к появлению нескольких одновременных потоков. Поэтому ответ никогда не будет отправлен, так как он ожидает завершения канала. Добавление следующего (); функция "за пределами потока" позволила завершить преобразование без прерывания или повторного выполнения блока кода, однако это привело к следующей ошибке при попытке отправить ответ:

throw new Error('Can\'t set headers after they are sent.');

Это рассматриваемый блок кода Node.js:

app.post('/convert/', function (req, res, next){
  var url = 'http://www.youtube.com/'+req.body.url;
  var quality = req.body.quality;
  var socketId = req.body.socketId;


stream = youtubedl(url, 
  ['-f ' + quality],

  // // Additional options can be given for calling `child_process.execFile()`. 
  { cwd: __dirname });

stream.on('info', function(info) {

  console.log('Download started');
  console.log('filename: ' + info._filename);
  console.log('size: ' + info.size);
  console.log('format: ' + info.format);

  var fileName = info._filename;
  var videoId = info.id;
  var videoTitle = info.title;
  videoTitle = videoTitle.replace(/[^a-zA-Z0-9\s]/g, '');
  console.log(videoTitle);

  var mp4 = 'downloads/'+videoTitle+'-'+info.format_id+'.mp4';
  fs.writeFile(mp4, "file", function(err) {
      if(err) {
          return console.log(err);
      }

    console.log("The file was saved!");
    var stat = fs.statSync(mp4);
    var str = progress({
      length: info.size,
      time: 100
    });

    str.on('progress', function(progress) {
      io.to(global.socketid).emit('progressVideo',{progress: progress.percentage});
      console.log(info.size);
      console.log(progress.transferred);
      console.log(progress.percentage);
      console.log(progress.remaining);
    });

    var pipe = stream.pipe(str).pipe(fs.createWriteStream(mp4));

    pipe.on('finish', function () {
      console.log("stream finished.");
      res.json(videoTitle+'-'+info.format_id+'.mp4');
    });
  });
 });
 // next();
});

Вызывается каким-то угловым кодом.

// Sends youtube link to backend
$scope.getVideo = function(youtubeLink, resolution){
    var cleanedLink = youtubeLink.substring(24);
    var url = {url: cleanedLink, quality: resolution};
    $http.post('/convert/', url).success(function (response){
      // Do some stuff
    });
}

Смущенный тем, почему он запускался более одного раза, я медленно удалял все больше и больше кода, пока не остался с этим простым тестом.

app.post('/convert/', function (req, res, next){
  console.log('hello!');
});

Который был вызван событием ng-click, и примерно через минуту ожидания консоль также распечатала два, а затем триhello! заявления. Я полностью потерян, почему это происходит. Если бы кто-нибудь мог пролить некоторый свет на это для меня, это было бы очень ценно.

Ответы на вопрос(0)

Ваш ответ на вопрос