我有一个在后端创建新文件的函数,但是<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)}>►</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})
}
});
1条答案
按热度按时间uqcuzwp81#
我认为一步一步地检查整个流程会很有用。使用
seed
参数更改URL是一个好主意,可以100%保证不使用缓存。很难说它是否正确工作。我会做的是1.检查Chrome DevTools中生成的请求。在网络部分,它会清楚地显示大小,以及是否来自缓存
1.您的Node.js服务器可能正在使用相同的文件。如何生成新文件?它是否存在争用条件,并且您试图在更新之前读取它