2016-03-31 8 views
0

Sorry für die Art der spezifischen Frage, aber ich habe ein sehr seltsames Problem und ich bin mir nicht sicher, warum es passiert.Node Request Handler Neustart mit Stream

Ich schreibe eine Node-Anwendung, die eine Youtube-Video-ID verwendet und dann das Audio an den Anforderer überträgt. Hier ist der Code.

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"); 
}); 

Das Problem ist, dass die Anforderung beginnt „Looping“ Ich denke, ist, wie ich es beschreiben würde, und die Anforderung wird 3-mal aufgerufen vor dem Anhalten.

Zum Beispiel ist hier der Ausgang für 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 - - 

an welcher Stelle es aufhört. Hat jemand irgendwelche Ideen, warum dies geschieht oder wie man zusätzliche Informationen bekommt? Ich bin total ratlos.

+0

Wie wird die Anfrage vom Kunden gestellt? – mscdex

+0

Ich besuche http: // localhost: 3000/resources/video/JCHTX_pgw6A mit meinem Browser (Chrome) und das Ergebnis ist der Browser Media Player, aber der Pfeil ist ausgegraut, weil er nicht geladen wird. –

+0

Gibt es Meldungen in der Chrome-Entwicklerkonsole und/oder nützliche Hinweise auf dem Netzwerk-Tab für die Videoanfragen? – mscdex

Antwort

0

die Request-Methode geändert POST und es gestoppt misbehaving.

0

Sie sollten nicht fs.unlink() direkt nach Ihnen starten, um die Datei zu streamen, andernfalls stoppt die Datei Streaming an den Client. Stattdessen, entweder finden Sie eine Möglichkeit, direkt von Youtube (eine bessere Lösung IMHO, wie Sie vermeiden würde, die Festplatte zu schlagen) oder mindestens warten, bis die Datei fertig Streaming vor dem Löschen ist. Für letztere, dass so etwas aussehen könnte:

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") 

oder vielleicht sogar noch besser (wartet auf den Dateideskriptor tatsächlich schließen zuerst):

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") 
+0

Also habe ich deine Lösung versucht, aber das Problem ist geblieben. Ich habe auch versucht, die Entlinkungslinie vollständig zu entfernen, und das Problem bestand immer noch. Auch ich fand heraus, dass die Anfrage nicht endlos Looping war, sondern nach dem dritten Mal gestoppt. Ich habe die Frage bearbeitet, um dies zu reflektieren. –