为什么不会为node.js服务器上托pipe的文件循环<audio>元素?

我使用以下在node.js服务器上托pipe的HTML进行testing:

<!doctype html> <html> <head> <meta charset='utf-8'> <title>Audio Testing</title> </head> <body> <audio src='/public/tests/audioTest.mp3' controls autoplay loop></audio> </body> </html> 

问题是audio只能在页面加载时播放一次(因为是mp3,所以只能使用Chrome)。

我怀疑这是一个node.js问题,因为audio循环罚款,当我testing这个本地加载HTML文件没有任何Web服务器。 它也可以在我testing过的Apache服务器上正常工作。 另外,如果我链接到Apache服务器上的一个mp3文件,它仍然按照预期的方式工作,节点服务器提供的HTML文件。

当编码为base64时,audio也很好地循环。

我正在使用node.js的0.8.14版本。 可以在这里访问节点上托pipe的代码的实时演示。

编辑服务器有一个名为“公共”的目录,如果他们被请求,服务器将始终提供文件。 audio文件和html页面都在“公共”目录中。

node.js服务器代码如下:

 var http = require('http'); var fs = require('fs'); var mime = require('mime');//Third party library for looking up mime types var handleRequest = function(req, res) { if (req.url === '/') { fs.createReadStream(__dirname+'/public/homePage.html').pipe(res); return; } else if (req.url === '/favicon.ico') { fs.createReadStream(__dirname+'/public/favicon.ico').pipe(res); return; } else if (req.url.substr(0, 7) === '/public') { var mim = mime.lookup(req.url); var ext = mime.extension(mim); console.log('mime '+mim+' ext '+ext); if (ext !== 'bin') { fs.exists(__dirname+'/'+req.url, function(exists) { if (exists) { if (req.headers.range) { var filename = __dirname+req.url; fs.readFile(filename, 'binary', function(err, file) { var header = {}; var range = req.headers.range; var parts = range.replace(/bytes=/, "").split("-"); var partialstart = parts[0]; var partialend = parts[1]; var total = file.length; var start = parseInt(partialstart, 10); var end = partialend ? parseInt(partialend, 10) : total-1; header["Content-Range"] = "bytes " + start + "-" + end + "/" + (total); header["Accept-Ranges"] = "bytes"; header["Content-Length"]= (end-start)+1; //header['Transfer-Encoding'] = 'chunked'; header["Connection"] = "close"; res.writeHead(206, header); res.write(file.slice(start, end)+'0', "binary"); res.end(); return; }); } else { res.writeHead(200,{'Content-Type':mim}); fs.createReadStream(__dirname+'/'+req.url).pipe(res); return; } else {res.end();} }); } else {res.end();} } else {res.end();} }; var server = http.createServer(handleRequest); server.listen(8888);//Listening on port 8888 

我怀疑这是因为你的Node.js服务器没有响应范围请求。

Chrome正在为文件中的某个字节集发送范围请求。 我不知道为什么没有得到响应中的那些字节就无法循环,但这应该是唯一的区别。