Re:node.jsでストリーミング的な
インプット(fs.ReadStream)もアウトプット(http.ServerResponse)もStream実装だし、pipe使うのが楽じゃないかと思った。
こんなかんじでどうですかね?
var http = require('http') , url = require('url') , path = require('path') , fs = require('fs') ; var server = http.createServer(function (req, res) { var file = path.join( __dirname, url.parse(req.url).pathname ); var onError = function (e) { res.writeHead(500, {'Content-Type': 'text/plain'}); res.end(e.toString()); console.error(e); return; }; var readStream = fs.createReadStream( file ); readStream.on('error', onError); res.writeHead(200, {'Content-Type': 'video/mp4'}); readStream.pipe(res); }); var port = 3000; server.listen(port); console.log("server start to listen on port %s", port);
元記事と違って*.mp4 ファイルを ストリームで流すだけのサーバ。
http://127.0.0.1:3000/hoge.mp4 とすると hoge.mp4 をながす
【追記: 2013.02.03】
npm モジュールを使うともっと楽で、例えば filed モジュールを使うと
var http = require('http') , url = require('url') , path = require('path') , filed = require('filed') ; var server = http.createServer(function (req, res) { var pathname = url.parse(req.url).pathname; filed(path.join( __dirname, pathname)).pipe(res); }); var port = 3000; server.listen(port, function () { console.log("server start to listen on port %s", port); });
とするだけで、面倒な背圧の処理や、ETag処理もしてくれる。