Запуск функции более одного раза возвращает «ошибка: невозможно установить заголовки после их отправки» - PullRequest
0 голосов
/ 09 апреля 2019

Программа работает как надо, пока я не попытаюсь использовать функцию еще раз, и она возвращает ошибку : невозможно установить заголовки после их отправки .

Я создаю этоприложение, чтобы познакомиться с nodejs и javascript, и я читал об ошибке, и это кажется проблемой при отправке более одного ответа на запрос.Я начал использовать res.setHeader до того, как узнал об этом, но я прочитал, что res.header может избежать этой проблемы, но она не решила, но я сохранил ее.

HTML:

<!doctype html>
<head>
    <link rel="stylesheet" type="text/css" href="youtube2music.css">
    <title>
        Youtube2Music
    </title>

</head>
<body>
    <div id="cabeza">
        <h1>
            Youtube 2 Music
        </h1>
        <p>
            just paste your link below and download your song.
        </p>
    </div>
    <div id="down-part">
        <input id="myUrl" class='myUrl-input'>
        </input>
        <button type="button" class="download_button">
        Download
        </button>
    </div>
</body>
<script src='youtube2music.js'></script>
</html>

Javascript:

var urlinput = document.querySelector('.myUrl-input'); // gets url inputbox
var button = document.querySelector('.download_button'); // gets download button

button.addEventListener('click', () => {

  console.log(urlinput.value); // prints in console the url
  sendUrl(urlinput.value); // sends url to function to start the request

});

// function to make requst
function sendUrl(URL){

  window.location.href = `http://localhost:4000/?URL=${URL}`; // makes the video request to nodejs server
}

index.js <файл узла: </p>

var eventEmitter = new events.EventEmitter();
var sfn;
appi.use(cors());
const {app, BrowserWindow} = require('electron')

function createWindow(){
  let win = new BrowserWindow({width:800, height:600});
  win.loadFile('index.html');
}
app.on('ready', createWindow)

appi.listen(4000, () => {
 console.log('server at port 4000');
});

appi.get('/',(req,res)=>{
 var URL = req.query.URL;
 ytdl.getInfo(URL, function(err,info){
   if(err) throw err;
   var songTitle = info.title;
   sfn = filenamify(songTitle);
   eventEmitter.emit('name_ready');
 });

 var startDownload = function(){
  let stream = ytdl(URL, {
   quality: 'highestaudio',
  });
  res.header('Content-Disposition', 'attachment; filename=' + sfn + '.mp3');
  res.header('Content-type', 'audio/mpeg');
  proc = new ffmpeg({source: stream})
  proc.withAudioCodec('libmp3lame').toFormat('mp3').output(res).run();
 }
 eventEmitter.on('name_ready', startDownload);
})

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

1 Ответ

1 голос
/ 09 апреля 2019

Есть несколько проблем с вашей текущей настройкой:

  1. Старайтесь не использовать генератор событий для сигнализации событий в HTTP-запросе, это не было сделано для этого.
  2. СHTTP-запросы, старайтесь не использовать глобальные переменные для данных, полученных во время запроса, когда два запроса приходят одновременно, они могут запутаться и получить неверные данные.
appi.listen(4000, () => {
 console.log('server at port 4000');
});

appi.get('/', (req,res)=> {
  const { URL } = req.query;
  ytdl.getInfo(URL, (err,info) => {
    if(err) throw err;
    const songTitle = info.title;
    const sfn = filenamify(songTitle);
    let stream = ytdl(URL, {
      quality: 'highestaudio',
    });
    res.set('Content-Disposition', 'attachment; filename=' + sfn + '.mp3');
    res.set('Content-type', 'audio/mpeg');
    const proc = new ffmpeg({source: stream})
    proc.withAudioCodec('libmp3lame').toFormat('mp3').output(res).run();
  });
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...