读取本地文件流并回退到其他源

Posted

技术标签:

【中文标题】读取本地文件流并回退到其他源【英文标题】:Reading local filestream with fallback to other source 【发布时间】:2016-08-07 07:38:09 【问题描述】:

我将文件存储在 Amazon S3 中,但也维护本地文件缓存。当我需要一个文件时,我想先检查缓存。我想避免在读取之前测试本地文件是否存在,因为 fs.exists 将被弃用,并且文件实际上可以在存在检查和文件读取之间被删除。

我想使用 Promise 和 Streams。下面的示例回退到另一个本地文件。我的真实代码将 S3 作为后备。

以下会是一个好的解决方案吗? 我发现获取失败读取信息的唯一方法是将错误处理程序连接到流。一旦我得到“可读”事件,我就会解开我的临时错误处理程序。

我也想知道当我使用“once”连接处理程序时是否真的需要解开处理程序。

'use strict';
const fs = require('fs');

function tryToReadLocalFile() 
  return new Promise(function(resolve, reject) 
    let rs = fs.createReadStream('./test1.txt');

    let errorListener = function(err) 
      reject(err);
    ;

    rs.once('error', errorListener)

    rs.on('readable', () => 
      rs.removeListener('error', errorListener);
      resolve(rs)
    );
  );    


function tryToReadAnotherFile() 
  return new Promise(function(resolve, reject) 
    let rs = fs.createReadStream('./test2.txt');

    let errorListener = function(err) 
      reject(err);
    ;

    rs.once('error', errorListener)

    rs.on('readable', () => 
      rs.removeListener('error', errorListener);
      resolve(rs)
    );    
  );


tryToReadLocalFile()
.catch(function(err) 
  if(err.code === 'ENOENT') 
    console.log('test1.txt not found. Fallback to test2.txt')

    //Reading from another file as a test. Should read from S3 as fallback
    return tryToReadAnotherFile();
   else 
    return Promise.reject(err);
  
).then(function(file) 
  console.log('writing to test.txt');
  let ws = fs.createWriteStream('./test.txt');
  file.pipe(ws);
);

--------- 编辑 -->

我现在已经实现了上述更紧凑的版本。不过,我仍然会感谢您对此的任何意见。这是解决这个问题的好方法吗?

如您所见,我不再费心检查 ENOENT。无论错误是什么,我都想回退到 S3。

function getFileFromStorageP(options) 
  return new Promise(function(resolve, reject) 
    let rs = fs.createReadStream(path.join(env.fsp.cacheDir, options.fileId));
    rs.once('error', (err) => reject(err));
    rs.once('readable', () => resolve(rs));
  ).catch(function(err) 
    return srvS3.download(
      fileId: options.fileId
    );
  );

【问题讨论】:

【参考方案1】:

我会发布一个答案供其他人阅读..

上述解决方案现已实施并且效果很好。不过,我还没有找到任何更简单的方法来控制错误。

【讨论】:

以上是关于读取本地文件流并回退到其他源的主要内容,如果未能解决你的问题,请参考以下文章

Three.js 检测 webgl 支持并回退到常规画布

本地仓库和远程仓库分支回退到指定的历史版本(idea)

如何支持 NTLM 身份验证并回退到 ASP.NET MVC 中的表单?

如何从 Zepto 回退到 Google CDN jQuery 到本地 jQuery?

PHP 从CDN加载jQuery,回退到本地(对于Wordpress)

HTML 使用谷歌CDN jQuery但回退到本地副本