请求时无法播放Expressjs音频流

时间:2020-09-02 15:31:07

标签: javascript express streaming html5-audio audio-streaming

我正在构建一个移动音乐应用程序,该应用程序使用Expressjs API,但无法通过流向客户端发送歌曲。

我的快速应用中有一条songs路线:

import express from 'express'

import fs from 'fs'

const router = express.Router()
router.get(
    '/:fileName',
    async (req: express.Request, res: express.Response) => {
        try {
            const { fileName } = req.params
            const filePath = `music/${fileName}`
            const stream = fs.createReadStream(filePath)
            const stat = fs.statSync(filePath)

            res.set('Content-Disposition', `attachment; filename="${filePath}"`)
            res.set('Content-Range', `bytes ${0}-${stat.size - 1}/${stat.size}`)
            res.set('Content-Length', `${stat.size}`)

            res.set('Content-Type', 'audio/mpeg')
            res.set('Accept-Ranges', 'bytes')

            stream.pipe(res)
        } catch (err) {
            res.status(400).send(err)
        }
    }
)

module.exports = router

我的移动应用程序是使用React构建的,并使用react-native-track-player。 由于某些原因,不仅在我的移动应用程序中,而且在浏览器甚至PostMan中都没有播放音频

在浏览器中:

browser doesn't play audio aswell

在PostMan中,它还要求我下载.mpga文件:

enter image description here

如果从Google云端硬盘获取另一个链接,则该音频可以播放,并且可以在我的移动应用中使用。

PostMan上的Google Drive链接:

enter image description here

我坚持了好几个星期。知道如何解决吗?谢谢你。

更新

使用ogg文件,流可以正常工作。 我想知道为什么mp3不支持。如果您有任何想法,请告诉我。

2 个答案:

答案 0 :(得分:0)

您应该必须在参数中访问变量

req.params

应转换为

req.params[0]

以访问从params传递的文件。 如Express API中所述:

// GET /file/javascripts/jquery.js
console.dir(req.params[0])
// => 'javascripts/jquery.js'

答案 1 :(得分:0)

您处理内容范围的方式是错误的。

res.set('Content-Range', `bytes ${0}-${stat.size - 1}/${stat.size}`)

您已经对开始范围进行了硬编码,但通常情况下,请求的范围并不总是始于0

在这种情况下,我强烈建议您简单地使用express.static(),甚至是像Nginx这样的常规Web服务器。它已经为您完成了工作。

此外,您的代码还有一个严重的安全漏洞,即任何人都可以通过传递相对路径../../../etc来基本上请求硬盘上的任何文件。

相关问题