微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。