如何解决通过管道将 Firebase 流传输到 HPE_INVALID_CONSTANT 中的 Express 响应结果
我正在尝试将视频 (mp4) 从 Firebase 存储传输到客户端上的 <video>
。我正在做的是使用 createReadStream
并将其传送到 Express 响应对象。但是在客户端上会抛出此错误:
代理错误:无法代理请求 /movie/600d31f192e0941f9c4b4773/stream 从 localhost:3000 到 http://localhost:5000/。 [1] 有关详细信息,请参阅 https://nodejs.org/api/errors.html#errors_common_system_errors (HPE_INVALID_CONSTANT)。
const streamMovie = async (req,res) => {
const range = req.headers.range
const movie = await Movie.findById(req.params.id)
const bucket = firebase.storage().bucket()
// Get video size
const videoFile = bucket.file(movie.videoFileUrl)
const [Metadata] = await videoFile.getMetadata()
const videoSize = Metadata.size
// Parse range
const parts = range.replace('bytes=','').split('-')
const start = parseInt(parts[0],10)
const end = parts[1] ? parseInt(parts[1],10) : videoSize - 1
res.writeHead(206,{
'Content-Type': 'video/mp4','Content-Range': `bytes ${start}-${end}/${videoSize}`,'Content-Length': `${end - start + 1}`,'Accept-Ranges': 'bytes',})
videoFile.createReadStream({ start,end }).pipe(res)
}
我无法查明错误的来源,因为我对流非常缺乏经验。任何帮助表示赞赏。谢谢!
解决方法
如果要将视频文件流式传输到快速响应对象,可以使用客户端库 official docs 中的代码示例。我已经成功测试了以下示例:
const express = require('express')
const app = express()
const port = 3000
app.get('/',(req,res) => {
const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
const bucket = storage.bucket('bucket123');
const remoteFile = bucket.file('videotest123.mp4');
res.writeHead(200,{
'Content-Type': 'video/mp4','Content-Range': 'bytes=0-','Accept-Ranges': 'bytes',})
remoteFile.createReadStream()
.on('error',function(err) {
res.send('there was an error');
})
.on('response',function(response) {})
.on('end',function() {})
.pipe(res);
})
app.listen(port,() => {
console.log(`App listening at http://localhost:${port}`)
})
如果您只想请求视频的某些部分(又名 Google Cloud Storage 对象),您可以在 createReadStream
方法中指定 start
和 end
选项。
const remoteFile = bucket.file('videotest123');
logFile.createReadStream({
start: 10000,end: 20000
})
.on('error',function(err) {})
.pipe(res);
关于 HPE_INVALID_CONSTANT
消息,我发现 here 消息表明 Web 服务器响应格式不正确。在本例中,代码中的 res
对象。
希望你觉得这有用
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。