NodeJS React流式音频文件被缓存

blmhpbnm  于 2023-03-22  发布在  Node.js
关注(0)|答案(1)|浏览(128)

我有一个在后端创建新文件的函数,但是<PlaySound />组件一直播放旧的声音文件,而不是更新的声音文件。声音文件有相同的名称/路径,只是内容不同。
我试着用row.text作为键,这样当文件的描述更新时,它会强制组件更新。我还试着生成一个GUID作为url的种子,并使用no-cache头,但似乎没有什么工作...

<PlaySound key={ row.text } path={ row.location.path } filename={ row.location.filename } />

这是PlaySound组件

import React, { Component } from 'react';
    
import { genUID } from '../../../helpers/helperFunctions';
    
class PlaySound extends Component
    {
        playSound(path, filename) {
            var endpoint = "http://0.0.0.0:8001/api/stream"
            var url = endpoint + "?path=" + path + "&filename=" + filename + "&seed=" + genUID()
            var audio = new Audio(url);
            console.log(audio);
            audio.load();
            audio.play();        
        }
    
        render() 
        {
            return (
                <div>
                    <span onClick={() => this.playSound(this.props.path, this.props.filename)}>&#9658;</span>
                </div>
            );
        }
    }
    
export default PlaySound

这是我的nodejs/express流实现。

app.get(API_VERSION + '/stream', (req, res) =>
{
  const filepath = req.query.path;
  const filename = req.query.filename;

  const file = '/app/audioExport/' + filepath + filename;

  try
  {
    res.writeHead(200, {
      'Cache-Control': 'no-cache, no-store, must-revalidate',
      'Pragma': 'no-cache',
      'Content-Type': 'audio/wav',
    });
    const rstream = fs.createReadStream(file);
    rstream.pipe(res);
  } catch (error) {
    res.json({error: error})
  }
});
uqcuzwp8

uqcuzwp81#

我认为一步一步地检查整个流程会很有用。使用seed参数更改URL是一个好主意,可以100%保证不使用缓存。很难说它是否正确工作。我会做的是
1.检查Chrome DevTools中生成的请求。在网络部分,它会清楚地显示大小,以及是否来自缓存
1.您的Node.js服务器可能正在使用相同的文件。如何生成新文件?它是否存在争用条件,并且您试图在更新之前读取它

相关问题