2016-04-15 86 views
0

我將文件存儲在Amazon S3中,但也維護本地文件緩存。當我需要一個文件時,我想首先檢查緩存。我希望避免在讀取之前測試本地文件存在,這是因爲fs.exists將被棄用,並且可以在存在檢查和讀取文件之間真正刪除文件。將本地文件流與回退到其他源

我想使用承諾和流。下面的例子有一個回退到另一個本地文件。我的真實代碼將有S3作爲後備。

下面是一個很好的解決方案嗎? 我發現獲取失敗讀取信息的唯一方法是將錯誤處理程序連接到流。一旦我得到「可讀」事件,我就解開我的臨時錯誤處理程序。

我也想知道如果我真的需要解開處理程序,當我用「一次」掛鉤它。

'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 
    }); 
    }); 
} 

回答

0

我會後給別人看的答案..

上述解決方案現在已經實現偉大工程。儘管如此,我還沒有找到更簡單的方法來解決這個錯誤。