Node.js自定义代理/缓存-通过可写流中的可读流提供文件服务

问题描述

我正在尝试在nodejs中进行简单的自定义HTTP代理/缓存。 这是我的测试代码

app.get('/bbb_sunflower_1080p_60fps_stereo_abl.mp4',async function (req,res) {
  var filePath = __dirname+"/cache/bbb_sunflower_1080p_60fps_stereo_abl.mp4"
  if (await fse.pathExists(filePath) == true)
  {
    console.log("Cache file exist")
    var readStreamFromFile = fs.createReadStream(filePath)
    readStreamFromFile.pipe(res)
  }
  else
  {
    console.log("Cache file doesn't exist")
    axios({
      method: 'get',url: "http://ftp.vim.org/ftp/ftp/pub/graphics/blender/demo/movies/BBB/bbb_sunflower_1080p_60fps_stereo_abl.mp4",responseType: 'stream',}).then(function (response) {
      var writeStreamToFile = fs.createWriteStream("cache/bbb_sunflower_1080p_60fps_stereo_abl.mp4")
      var readStreamFromremote = response.data
      readStreamFromremote.pipe(writeStreamToFile)
      readStreamFromremote.pipe(res)
    })
  }
})

用户访问/bbb_sunflower_1080p_60fps_stereo_abl.mp4时:

  1. 如果本地文件不存在,请从远程位置(使用axios)获取文件,并将响应通过管道传输到用户响应和本地文件
  2. 如果存在本地文件,则将本地文件流通过管道传递给用户

这实际上效果很好,但是问题是当2个不同的用户同时调用/bbb_sunflower_1080p_60fps_stereo_abl.mp4时。当前将从writeStreamToFile写入缓存文件时,用户将从readStreamFromFile的缓存中获取文件

如果readStreamFromFile的速度比writeStreamToFile快,则readStreamFromFile将终止,因为它认为当前文件正在增长,而它已经传输了整个文件

我该如何强制readStreamFromFile与writeStreamToFile完美同步,并且在文件实际完成之前不结束?

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)