【问题标题】:Piping Firebase stream to Express response result in HPE_INVALID_CONSTANT将 Firebase 流传输到 Express 响应导致 HPE_INVALID_CONSTANT
【发布时间】:2021-02-09 06:52:05
【问题描述】:

我正在尝试将视频 (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)
}

我无法确定错误的来源,因为我对流非常缺乏经验。任何帮助表示赞赏。谢谢!

【问题讨论】:

    标签: node.js firebase express google-cloud-storage video-streaming


    【解决方案1】:

    如果您想将视频文件流式传输到快速响应对象,您可以使用来自客户端库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 服务器响应格式错误。在这种情况下,代码中的resobject。

    希望对你有用

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 2013-12-02
      • 2022-01-06
      • 1970-01-01
      • 2011-01-25
      • 2019-12-29
      • 2020-11-28
      • 2014-02-25
      • 2021-06-12
      相关资源
      最近更新 更多