微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过管道将 Firebase 流传输到 HPE_INVALID_CONSTANT 中的 Express 响应结果

如何解决通过管道将 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 方法中指定 startend 选项。

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 举报,一经查实,本站将立刻删除。