2016-03-31 12 views
0

特定の質問を申し訳ありませんが、私は非常に奇妙な問題を抱えています。なぜそれが起こっているのかわかりません。ノード要求ハンドラがストリームで再起動する

私は、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 - - 

用の出力です。なぜこれが起こっているのか、または追加情報を得る方法について誰かが考えていますか?私は完全に困惑しています。

+0

リクエストはどのようにクライアントから行われますか? – mscdex

+0

私はブラウザ(Chrome)でhttp:// localhost:3000/resources/video/JCHTX_pgw6Aにアクセスしています。結果はブラウザのメディアプレーヤーですが、矢印はロードされないためグレー表示されています。 –

+0

Chromeデベロッパーコンソールにメッセージやビデオリクエストのネットワークタブのメッセージがありますか? – mscdex

答えて

0

は、POST要求の方法を変更し、それが不正な動作を停止しました。

0

の直後にfs.unlink()を呼び出すと、ファイルをストリーミングするためにが開始されます。そうでない場合、ファイルはクライアントにストリーミングされなくなります。代わりに、youtubeから直接ストリームする方法を見つけてください(ディスクに触れないようにIMHOの方がよいでしょう)または少なくとも、ファイルが削除されるまでストリーミングが完了するまで待ってください。 (最初に実際に近いファイルディスクリプタを待って)より良いおそらく

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

だから、私はあなたの解決策を試みましたが、問題は残っていました。私はunlinkラインを完全に削除しようとしましたが、問題は依然として残っていました。 また、リクエストが無限ループではなく、3回目以降に停止していることがわかりました。私はこれを反映するために質問を編集しました。 –

関連する問題