我有时会在我的Node.js服务器上收到错误,告诉我req.headers.range
在用户请求.mp4
时未定义(我还没有尝试过提供任何其他视频文件类型,但不确定如果mp4是相关的)。我不明白为什么这个标题丢失了。
视频的请求标题有时会排除range
吗?
我像这样发送流:
var videoReqHandler = function(req, res, pathname) {
var file = dirPath + "/Client" + pathname;
var range = req.headers.range;
var positions = range.replace(/bytes=/, "").split("-");
var start = parseInt(positions[0], 10);
fs.stat(file, function(err, stats) {
if (err) {
throw err;
} else {
var total = stats.size;
var end = positions[1] ? parseInt(positions[1], 10) : total - 1;
var chunksize = (end - start) + 1;
res.writeHead(206, {
"Content-Range" : "bytes " + start + "-" + end + "/" + total,
"Accept-Ranges" : "bytes",
"Content-Length" : chunksize,
"Content-Type" : "video/mp4"
});
var stream = fs.createReadStream(file, {
start : start,
end : end
}).on("open", function() {
stream.pipe(res);
}).on("error", function(err) {
res.end(err);
});
}
});
};
错误:
/video_stream.js:21
var positions = range.replace(/bytes=/, "").split("-");
TypeError: Cannot call method 'replace' of undefined
答案 0 :(得分:3)
Range
标头是可选的:
使用条件或无条件GET方法的HTTP检索请求 MAY 使用Range请求标头请求实体的一个或多个子范围,而不是整个实体 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2)
请求是否适用于视频流无关紧要。我认为浏览器(或视频播放器库)不会为初始请求发送Range
标头,只会在搜索过程中使用它。
答案 1 :(得分:1)
您应该确保您正在回复GET请求。可能是浏览器正在发送HEAD请求以获取文件信息。 HEAD请求不包含范围标题。